代码没有给出所需的输出

时间:2014-02-22 04:12:56

标签: c floating-point

#include <stdio.h>
main()
{
    float f = 0.1;
    if (f == 0.1)
        printf("True");
    else
        printf("False");
}

输出:     False

为什么打印False而非True

4 个答案:

答案 0 :(得分:4)

您不应该使用!=来检查float

代码等于检查if (0.1f == 0.1),因为促销和转化规则意味着比较发生在双数之间。十进制数0.1表示为单精度浮点数和双精度双精度数(并且这两个表示都不精确),因此当0.1f被提升为double时,结果与double有很大不同代表0.1。

你应该使用

if (fabs(f-0.1) < 0.001)      // for 0.001, can be other suitable precisions 

P.S。:要继续阅读,请查看What Every Computer Scientist Should Know About Floating-Point Arithmetic

答案 1 :(得分:3)

典型的浮点并不完全代表精确到0.1的数字。

0.1double,只有几乎数值0.1 - 见下文。将其分配给float会进一步降低精度。

float f = 0.1;
// Convert 0.1 to a `double`.  closest double is     0.10000000000000000555
// Assigned that double to a float: closest float is 0.10000000149011611938

最后将此与0.1的高精度double版本进行比较会导致不匹配。

if (f == 0.1) // does not compare as equal
// compare f which is 0.10000000149011611938 to 
// 0.10000000000000000555 and they are not equal.

实施例

volatile float f = 0.1;
printf("%.20f\n", f);
// 0.10000000149011611938
volatile double d = 0.1;
printf("%.20f\n", d);
// 0.10000000000000000555

答案 2 :(得分:1)

您可以使用

if(f-0.1<=accuracy)

答案 3 :(得分:1)

不要对浮点数使用(in)相等性 - 它们存储为不精确的数字 - 这就是浮点数的来源

if (fabsf(f - 0.1) < precision) ...

precision是您需要的准确度

参见fabs(3)What Every Computer Scientist Should Know About Floating-Point Arithmetic