C-浮点精度

问题描述 投票:0回答:4

我有一个程序:

int main() 
{   
        float f = 0.0f;  
        int i;  

        for (i = 0 ; i < 10 ; i++) 
                f = f + 0.1f; 

        if (f == 1.0f) 
                printf("f is 1.0 \n"); 
        else 
                printf("f is NOT 1.0\n"); 

        return 0; 
} 

它总是打印

f is NOT 1.0
。我知道这与 C 中的浮点精度有关。但我不确定它到底在哪里搞砸了。有人可以解释一下为什么它不打印另一行吗?

c floating-point precision
4个回答
6
投票

二进制浮点数不能准确表示值 0.1,因为它的二进制展开式没有有限位数(与 1 ÷ 7 的十进制展开式完全相同)。

0.1的二进制展开是

0.000110011001100110011001100...

当截断为 IEEE-754 单精度时,这大约是十进制的

0.100000001490116119
。这意味着每次将“接近 0.1”的值添加到变量中时,都会累积一个小误差 - 因此最终值略高于
1.0
.


3
投票

你不能这样比较浮点数。您需要定义一个阈值并根据该阈值进行比较。 这篇 博文解释了


3
投票

这相当于将 0.33 相加 3 次 (0.99) 并想知道为什么它不等于 1.0。

你不妨阅读What Every Programmer Should Know About Floating Point Arithmetic


2
投票

对于浮点数,在比较它们时应始终使用 epsilon 值:

#define EPSILON 0.00001f

inline int floatsEqual(float f1, float f2)
{
    return fabs(f1 - f2) < EPSILON; // or fabsf
}
© www.soinside.com 2019 - 2024. All rights reserved.