3

我的代码是

void main()
{
    float a = 0.7;
    if (a < 0.7)
        printf("c");
    else
        printf("c++");
} 

它打印出来C,这很好,a被视为双常量值,它的值将0.699999小于0.7.

现在,如果我将值更改为0.1,0.2,0.3until 0.9ina和 atif condition然后它会打印C++,除此之外0.7 and 0.9意味着两者相等或 a 更大。

为什么这个概念不考虑所有价值?

4

1 回答 1

11

你在说什么“概念”?

您提到的数字都不能以二进制浮点格式精确表示(无论精度如何)。您提到的所有数字最终在点之后都有无限数量的二进制数字。

由于既没有floatdouble没有无限的精度,在float和格式中,实现将近似地double表示这些值,最有可能通过最接近的可表示二进制浮点值。对于和 ,这些近似值会有所不同。并且近似值最终可能会大于或小于近似值。因此,您观察到的结果。floatdoublefloatdouble

例如在我的实现中, 的值0.7表示为

+6.9999998807907104e-0001 - float
+6.9999999999999995e-0001 - double

同时 的值0.1表示为

+1.0000000149011611e-0001 - float
+1.0000000000000000e-0001 - double

As you can see, double representation is greater than float representation in the first example, while in the second example it is the other way around. (The above are decimal notations, which are rounded by themselves, but they do have enough precision to illustrate the effect well enough.)

于 2012-09-06T17:47:02.920 回答