linux C 下定义float 52.1 输出怎么是52.099999

linux C 下定义float 52.1 输出怎么是52.099999,第1张

很正常,这和浮点数在计算机中的表示有关!

浮点数在计算机中是采用二进制科学计数法存储的。

一、浮点数转换成二进制

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位,所以后几位肯定是不准的。

当然,我上面说的精度,只是某些版本中的。也不排除有更高精度的版本?


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/9003847.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-23
下一篇2023-04-23

发表评论

登录后才能评论

评论列表(0条)

    保存