【发布时间】:2017-06-01 04:03:59
【问题描述】:
Comparing Same Float Values In C
strange output in comparison of float with float literal
Float addition promoted to double?
我在浮点数上阅读了上述链接,但甚至得到了奇怪的输出。
#include<stdio.h>
int main()
{
float x = 0.5;
if (x == 0.5)
printf("IF");
else if (x == 0.5f)
printf("ELSE IF");
else
printf("ELSE");
}
现在,根据促销规则,“ELSE IF”不是必须要打印吗?
但是,这里打印的是“IF”
编辑:是不是因为 0.5 = 0.1 在二进制中,然后一切都是 0 并且精度损失因此没有效果,所以比较 IF 返回 true。
如果是 0.1、0.2、0.3、0.4、0.6、0.7....,那么 Else If 块返回 true。
请原谅我问同样的问题,因为我从上面的链接中读到,永远不能进行浮点比较。
但是,这种意外行为的原因是什么?
【问题讨论】:
-
The usual arithmetic conversion rules 表示如果其中一个操作数是
double,则另一个操作数将转换为double。所以条件x == 0.5实际上是(double) x == 0.5这当然是真的。但是,由于计算机上的浮点值存在问题(请参阅 Is floating point math broken? 了解详细信息),很少有值是这样的。 -
我仍然认为你的问题有点不清楚,但如果我理解正确(并接受 Gerhardh 提供的答案),那么是的,你是对的。
-
@Someprogrammerdude 是的,这正是我推断的。谢谢!!
-
“它们永远不准确。” 这是常见的误解。对于它们被设计用来表示的值,浮点数与整数一样准确。只是程序员经常抱有错误的期望,C 的各种类型转换规则都无济于事。
标签: c floating-point precision