
浮点数在计算机中是采用二进制科学计数法存储的。
一、浮点数转换成二进制
52.1=110100.0001100110011(小数部分不能完全转换)
二、表示成二进制科学计数法
1.101000001100110011 * 2^5
三、按IEEE754进行数据存储
因此,再将内存中的数据转换成十进制输出来的数据不是完整的52.1,只是非常接近它。
计算机内部保留的数值,精度是有限的。不同的C语言版本可能有不同。常见的某些版本中,情况如下(其中的“位”指二进制的位):
float型:8位阶码,24位尾数;
double型:8位阶码,56位尾数。
阶码是用来表示小数点位置的,尾数则是表示有效数字的值。故double型有效数字最多保留56位。
故这种情况下,最低位的分辨能力,只能达到整个量程的2的56次方分之一。
如果数据本身,有更低位的小数,就只能舍入近似了。
而且我们知道,尾数还有正负两种可能,故其绝对值的最大值,只能达到整个量程的一半。
更何况,绝对值不见得能达到最大(规格化后可以不小于最大值的一半)。
如此,最低位舍入形成的相对误差,就会达到2的55次方分之一,至2的54次方分之一。
而如果用十进制表示,2的55次等于36028797018963968,2的54次方等于18014398509481984。都是17位的数字。
换句话说,double型精度,如果对于17位的十进制有效数字,其误差就相当于最低位了。
因此,如果您输入的数据有效数字更长,那么17位之后,肯定没有保留,已经不准确了。
而你的b=1234567890123456.123456已经达到了22位,所以后几位肯定是不准的。
当然,我上面说的精度,只是某些版本中的。也不排除有更高精度的版本?
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)