比较相同的浮点值时出现奇怪的输出?
Strange output when comparing same float values?
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 returns 正确。
如果它是 0.1, 0.2, 0.3, 0.4, 0.6, 0.7.... ,那么 Else If 块 returns true.
请原谅我问同样的问题,因为我从上面的链接中了解到绝对不能进行浮动比较。
但是,这种意外行为的原因是什么?
第一个 if
语句的计算结果为 true
,因此打印 IF
。其他表达式甚至都没有检查。
当您阅读有关浮点类型和比较问题的链接时,您可能期望 0.5 在转换过程中四舍五入,因此比较应该失败。
但是 0.5 是 2 的幂并且可以完美地表示而无需在 float 或 double 类型变量中进行任何舍入。
因此比较结果为 TRUE。
编辑问题后:
是的,如果你取了 0.1 或你提到的其他值之一,你应该 运行 到 else 部分。
Floating point numbers are never accurate.
这个说法是错误的。有些浮点数是准确的,比如1.0、12345.0、12345.5、-2.25。所有这些数字都可以表示为除以 2 的幂的整数。所有不能表示的数字也不准确。
在您的特定情况下,float x = 0.5
导致 x
的值为 1.00000000 * 2^-1
。当您将其与 double 0.5
进行比较时,两个操作数都转换为 double
,因此比较变为 1.000000000000000 * 2^-1 == 1.000000000000000 * 2^-1
,比较成功。
对于float x = 0.1
,它看起来不同。该值存储为 1.01010101 * 2^-3
(或类似)。请注意,这已经不准确了。当您将此与 double 0.1
进行比较时,浮点数在末尾用零扩展,比较变为 1.010101010000000 * 2^-3 == 1.010101010101010 * 2^-3
,失败。
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 returns 正确。
如果它是 0.1, 0.2, 0.3, 0.4, 0.6, 0.7.... ,那么 Else If 块 returns true.
请原谅我问同样的问题,因为我从上面的链接中了解到绝对不能进行浮动比较。
但是,这种意外行为的原因是什么?
第一个 if
语句的计算结果为 true
,因此打印 IF
。其他表达式甚至都没有检查。
当您阅读有关浮点类型和比较问题的链接时,您可能期望 0.5 在转换过程中四舍五入,因此比较应该失败。 但是 0.5 是 2 的幂并且可以完美地表示而无需在 float 或 double 类型变量中进行任何舍入。 因此比较结果为 TRUE。
编辑问题后: 是的,如果你取了 0.1 或你提到的其他值之一,你应该 运行 到 else 部分。
Floating point numbers are never accurate.
这个说法是错误的。有些浮点数是准确的,比如1.0、12345.0、12345.5、-2.25。所有这些数字都可以表示为除以 2 的幂的整数。所有不能表示的数字也不准确。
在您的特定情况下,float x = 0.5
导致 x
的值为 1.00000000 * 2^-1
。当您将其与 double 0.5
进行比较时,两个操作数都转换为 double
,因此比较变为 1.000000000000000 * 2^-1 == 1.000000000000000 * 2^-1
,比较成功。
对于float x = 0.1
,它看起来不同。该值存储为 1.01010101 * 2^-3
(或类似)。请注意,这已经不准确了。当您将此与 double 0.1
进行比较时,浮点数在末尾用零扩展,比较变为 1.010101010000000 * 2^-3 == 1.010101010101010 * 2^-3
,失败。