可能重复:
strange output in comparision of float with float literal
Comparison of float and double variables
我有一个带有double的测试并且在C中浮动,但我无法解释原因。
float x = 3.4F;
if(x==3.4)
printf("true\n");
else printf("false\n");
double y = 3.4;
if (y==3.4)
printf("true\n");
else printf("false\n");
结果将为False和True。请帮我解释一下。
答案 0 :(得分:5)
x == 3.4
应为x == 3.4F
,否则3.4为双倍(默认情况下)。总是比较喜欢,而不是苹果和橘子。
编辑: 不同精度类型之间的比较结果是真还是假取决于编译器的浮点表示。
浮点数,无论是单精度(浮点数)还是双精度,都是近似值。
答案 1 :(得分:5)
3.4不能精确地表示为double,原因与三分之一不能使用有限位数精确表示为10的十进制数一样 - 表示重复出现。
因此,双字面3.4
实际上是最接近3.4的双精度值。 3.4F
是最接近3.4的浮点值,但与最接近的double值不同。
当你将float与double进行比较时,float会转换为double,而不会改变它的值。
因此,3.4F != 3.4
,就像0.3333 != 0.33333333
答案 2 :(得分:2)
不保证结果是错误的和真实的,但基本的想法非常简单:3.4
的类型为double。当您将其分配给float
时,它将被舍入。比较时,该舍入后的数字将被提升为双倍,而不一定是{em>相同的倍数,而不是3.4
。
在第二种情况下,一切都是双倍的。
答案 3 :(得分:0)
比较平等 浮点数学并不准确。像0.2这样的简单值无法使用二进制浮点数精确表示,浮点数的有限精度意味着操作顺序的微小变化可能会改变结果。不同的编译器和CPU架构以不同的精度存储临时结果,因此结果将根据您的环境的详细信息而有所不同。如果您进行计算,然后将结果与某些预期值进行比较,那么您很可能无法获得预期的结果。
换句话说,如果您进行计算然后进行此比较: if(result == expectedResult)
那么比较不太可能。如果比较为真,那么它可能不稳定 - 输入值,编译器或CPU的微小变化可能会改变结果并使比较成为假。
答案 4 :(得分:0)
作为提示,将浮点数(浮点数或双精度数)与'=='进行比较在大多数情况下是一种糟糕的编程习惯,因为您可能永远不会认为该语句是真的。这两个数字的最低有效位可能不同。
最好使用以下内容:
abs(x - y) < EQUALITY_MARGIN
EQUALITY_MARGIN
是一个足够小的数字。