0

我制定了以下代码并得到了一个奇怪的输出。谁能解释它是如何工作的?

main()
{
    float a=0.8;
    float b=0.25;
    if(a==0.8)
        printf("HELLO")
    if(b==0.25)
        printf("WORLD")
}

我得到的输出令人惊讶

WORLD

提前致谢

4

5 回答 5

5

这是因为 0.25 是 2 的幂(即 2^-2),而 0.8 不是。只有 2 的幂的精确和才能精确表示;float所有其他数字,包括 0.8,都表示为近似值,在和之间具有不同的精度double0.8ina==0.8是一个,doublewhilea是一个float。他们的表现不同,他们的价值观也不同。

于 2013-03-26T13:38:41.453 回答
3

您绝不能像以前那样将float-values 与绝对值进行比较。通常会有轻微的舍入误差,因为浮点数是根据 IEEE 754 表示的,并且机器无法提供精确的浮点值。

这里查看您的解释,尤其是舍入规则。

于 2013-03-26T13:39:37.977 回答
2

您正在将 float 与 double 进行比较。尝试在数字后加一个 f

if(a==0.8f)
    printf("HELLO")
if(b==0.25f)
    printf("WORLD")
于 2013-03-26T14:23:55.990 回答
0

给出的答案是正确的......在 Dobb 博士的 Andrew Koenig 正在写关于与浮动的订单关系的文章中,有一个观点:

其难以比较的浮点数

比较整数与浮点1

于 2013-03-26T13:44:18.530 回答
0

一切最终都存储在位中......所以浮点数会被四舍五入,以防它们的二进制等价物重复出现......

于 2013-03-26T14:33:15.590 回答