将一个浮点变量与其包含的值进行比较

时间:2013-06-18 10:02:06

标签: c floating-point

#include<stdio.h>
int main()
{
    float a,b;
    a=4.375;
    b=4.385;

    if(a==4.375)
        printf("YES\n");
    else
        printf("NO\n");

    if(b==4.385)
        printf("YES\n");
    else
        printf("NO\n");

    return 0;
}

回答此代码:

YES 
NO

我一直在想,如果我将浮点数与double值进行比较。它永远不会匹配它。除非值是纯整数。但这里浮动“a”的确是4.375,但“b”不是

printf("%0.20f\n",a);
printf("%0.20f\n",b);

This prints :

4.37500000000000000000
4.38500022888183593750



but if i print

printf("%0.20f\n",4.475);

It prints 4.47499990463256835938

这种舍入效应如何在某些情况下显示,而在其他情况下则不显示。

任何人都可以解释这一点。 “WE”应该如何判断float变量中的值何时与其中包含的值匹配,何时不匹配?

2 个答案:

答案 0 :(得分:1)

只有当小数部分可以用0.50.25,......等二进制分数求和时,从小数部分到二进制分数的转换才是精确的。

例如在您的情况下

0.375 = 0.25 + 0.125 = 2 -2 + 2 -3

因此可以使用二进制分数精确表示。

无法通过精确使用二进制分数来表示数字0.385。因此,0.50.250.125,......等数字或这些数字的组合可以完全表示为浮点数。其他像0.385在对它们执行比较或相等操作时会给出不正确的结果。

答案 1 :(得分:1)

浮点不是魔法。 它们包含一个确切的值,如果你将它与它进行比较,它们将比较相等。这两个问题是 1)由于精度问题,某些操作并不总是完全准确。如果你向float中添加一个然后减去一个,那么添加一个可能会导致最低有效值位的某些精度损失,当你减去它时,你不会回到你期望的相同值。 2)不可能精确地表示浮点二进制格式中的每个十进制值。例如,无法在浮点二进制数中存储精确值0.1,这与您无法使用多少位数无法将1 / 3.0的值精确地写为十进制值完全相同。 / p>

但在您的情况下如果您存储一个值并将其与相同的值进行比较,则它们应该相等,因为它们都以相同的方式具有相同的问题。 你的问题虽然是你没有比较喜欢。 4.375和4.385不是浮点数它们是双倍的并且转换为存储,因此当您稍后比较它们时,转换后的值可能不完全相同。如果你写4.385f和4.385f来使用浮点值,你应该两次都得到YES。