浮点比较难题
考虑以下 C 代码:
int main() { float a = 0.7; float b = 0.5; if (a < 0.7) { if (b < 0.5) printf("2 are right"); else printf("1 is right"); } else printf("0 are right"); }
您直观地期望输出为是“0是对的”。然而,令人惊讶的结果是“1是正确的”。为什么会出现这种情况?
浮点比较的陷阱
关键在于C中浮点数和双精度数的区别。代码中,变量a和b被声明为float,即32位浮点数。然而,这两个比较(a
在比较期间,浮点变量被提升为双精度数,从而允许更高的范围和精度。然而,由于浮点数的精度有限,这种转换可能会引入微妙的伪影。在这种情况下,浮点数 0.7 并不完全等于双精度数 0.7。
具体来说,浮点数 0.7 在 IEEE 754 标准中表示为 0x3f000000。当提升为双精度时,该值并不是 0.7 的精确表示。相反,它会变得稍大一些,大约为 0x3f00000000000000(大约 0.7000000000000001)。
意外结果的原因
由于此促销,条件 a
0.7 变为 true,因为 a 的双重表示略小于 0.7。随后,第二次比较b<0。 0.5 的计算结果为 false,因为 b(精确表示为双精度型)等于 0.5。因此,代码打印“1 是正确的。”解决方案
要解决此问题,您可以:以上是为什么在 C 中比较浮点数和双精度文字会产生意外的结果?的详细内容。更多信息请关注PHP中文网其他相关文章!