c 中浮动奇怪的不精确错误[重复]

2023-12-11

今天发生在我身上的一件奇怪的事情,当我尝试编译和执行这段代码的输出不是我所期望的。下面的代码只是将浮点值添加到浮点数组中,然后将其打印出来。 简单的代码:

int main(){
    float r[10];
    int z;
    int i=34;
    for(z=0;z<10;z++){
        i=z*z*z;
        r[z]=i;
        r[z]=r[z]+0.634;
        printf("%f\n",r[z]);
    }
}

输出:

0.634000
1.634000
8.634000
27.634001
64.634003
125.634003
216.634003
343.634003
512.633972
729.633972

请注意,从 27 开始,0.634 之后出现的数字不应该出现在那里。有谁知道为什么会发生这种情况?这是由浮点近似引起的事件吗?..

P.S 我有一个linux debian系统,64位

谢谢大家


数字可以用以下形式表示:

[sign] [mantissa] * 2[exponent]

所以当内存空间较小时就会出现舍入或相对误差。

From wiki:

单精度浮点格式是一种计算机数字格式,占用空间计算机内存中的 4 个字节(32 位)并使用浮点表示宽动态范围的值。

enter image description here

IEEE 754 标准将 binary32 指定为具有:

Sign bit: 1 bit
Exponent width: 8 bits
Significand precision: 24 bits (23 explicitly stored)

这给出了来自6 至 9 位有效小数位精度(如果一个 最多 6 位有效小数的十进制字符串转换为 IEEE 第754章 有效小数,那么最终的字符串应该与原始字符串匹配; 如果将 IEEE 754 单精度转换为十进制字符串 至少保留 9 位有效小数,然后转换回单位数, 那么最终的数字必须与原始的[4]一致)。

编辑(爱德华的评论):更大(更多位)的浮点表示可以实现更高的精度.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c 中浮动奇怪的不精确错误[重复] 的相关文章

随机推荐