根据IEEE754浮点数的表示方法,和经过测试后,确认double能表达的区间为[-1.7e308,-1.7e-308]U[1.7e-308,1.7e308]
就是说其绝对值是在1.7e-308到1.7e308的;
指数决定了它能表示的最大值和最小值
(strtod能将字符串里的数读入一个double,头文件是stdlib.h)
如果一个double小于或等于1.7e-308,那会表现为0,如下测试
char*str="1.7e-308";//正负号不影响其绝对值大小,若有-号,结果为-0,是一样的
char*end; ///对于double来说,这个数就是0
double d=strtod(str,&end);
printf("%lf\n%s\n%s\n",d,end,str);
//结果表现为0
如果小于这个1.7e-308,结果也表现为0,下图为1.2e-308,结果输出也是0
-----------------------------------------------------------
稍有区别的是,当一个double大于1.7e308时,会得到一个INF
等于1.7e308时,得到一个无限接近它的数
等于
char*str="1.7e308xas";
char*end;
double d=strtod(str,&end);
printf("%lf\n%s\n%s\n",d,end,str);
大于
char*str="1.8e308xas";
char*end;
double d=strtod(str,&end);
printf("%lf\n%s\n%s\n",d,end,str);
这是因为浮点数是用二进制的科学计数法记录的,在计算机内有1位符号位、若干位指数位,若干位尾数位,假设指数位为n,那指数的范围是1-(2^(n-1)-1)~2^n-2-(2^(n-1)-1),ieee规定了指数位不能全为0或1(有特殊含义),尾数位是科学记数法的小数点后面的数,小数点前面的默认为1,
当指数超出表示范围是会产生溢出,表现为正无穷或者负无穷(全1的情况),如果是太小了就会置为0(全0的情况)