0

请解释不同情况下的输出

#include<stdio.h>
int main()
{
    float a=5.9; //a=0.9
    if (a==5.9)
        printf("Equal");
    else if (a<5.9)
        printf("Less than");
    else
        printf("Greater than");
    return 0;
} 

当 a 为 5.9 时,输出为“大于”,当 a 为 0.9 时,输出为“小于”。为什么?

4

6 回答 6

3

在 C 中,文字“5.9”具有类型double,并由常见编译器转换为 5.9000000000000003552713678800500929355621337890625,因为它们使用二进制 IEEE-754 浮点数,并且该数字是可表示为double最接近 5.9 的值。float您的代码使用该值初始化 a 。这需要将 a 转换double为 a float,结果是 5.900000095367431640625,因为这float是最接近该值的double值。显然,后者大于前者,这就是为什么你的输出是“大于”的原因。

使用 .9,文字“.9”将转换为double0.90000000000000002220446049250313080847263336181640625。然后将double其转换为float0.89999997615814208984375,这显然小于double.

于 2013-03-05T01:19:51.047 回答
1

您的变量是浮点数,但常量是双精度数。由于该值无法精确存储,因此 ti 将作为浮点数和双精度值以不同的方式存储。如果您使用相同的数据类型,您将获得所需的结果

http://codepad.org/1q5mwFGd

http://codepad.org/Q4lOQnG8

于 2013-03-05T01:08:31.280 回答
0

由于十进制二进制转换,0.9 表示为 2^-1 的幂的总和:

0.9 - (0.5 + 0.25 + 0.125) = 0.025

但 0.025 不是 2^-1 的精确幂。因此,您需要在比较中以相同的精度表示这两个数字。由于 float 和 double 具有不同的精度,因此它们比较不相等。

于 2013-03-05T01:16:33.243 回答
0

浮点数本质上是不精确的。如需快速介绍,您可以在此处阅读一些内容。 http://floating-point-gui.de/errors/comparison/

有关有效比较策略的一些建议,请参阅这篇文章。 浮动和双重比较最有效的方法是什么?

于 2013-03-05T01:06:35.863 回答
0

这是因为在内部,浮点数以二进制形式存储,5.9 不能完全表示为 5.9。看看下面类似的问答:为什么一个 C 浮点类型在输出上会修改 125.1 的实际输入为 125.099998?

于 2013-03-05T01:09:21.770 回答
0

比较浮点数时最好避免使用“==”。

这是因为某些值无法在不损失精度的情况下正确存储。

所以最好说:

if( fabs(a-5.9) < .0001 ) {
    // 'EQUAL' or at least near enough!
}

我知道这需要更多的计算,但它会按照您期望的方式运行。

于 2013-03-05T01:10:32.917 回答