在c中浮动奇怪的不精确错误

use*_*740 1 c floating-point floating-accuracy approximation

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

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]);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

0.634000
1.634000
8.634000
27.634001
64.634003
125.634003
216.634003
343.634003
512.633972
729.633972
Run Code Online (Sandbox Code Playgroud)

请注意,从.634之后出现的数字应该不在那里.谁知道为什么会这样?这是由浮点近似引起的事件?

PS我有一个linux debian系统,64位

谢谢大家

Sad*_*que 5

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

[sign] [尾数]*2 [指数]

因此,当内存空间较小时,会出现舍入或相对错误.

来自维基:

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

在此输入图像描述

IEEE 754标准规定binary32具有:

Sign bit: 1 bit
Exponent width: 8 bits
Significand precision: 24 bits (23 explicitly stored)
Run Code Online (Sandbox Code Playgroud)

这给出了6到9个有效十进制数字精度(如果一个十进制字符串最多有6个有效小数被转换为IEEE 754单精度,然后转换回相同数量的有效小数,则最终字符串应该与原始字符串匹配;并且如果将IEEE 754单精度转换为具有至少9个有效小数的十进制字符串,然后转换回单个,则最终数字必须与原始数字匹配[4].

编辑(爱德华的评论):更大(更多位)的浮点表示允许更高的精度.

  • *“浮点数越大,精度越差”*是一个不精确的说法。我认为你的意思是更大(更多位)的浮点表示可以实现更高的精度。 (2认同)