浮点比较异常
浮点比较的概念可能会产生误导,尤其是在处理浮点数据类型时。考虑以下示例:
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 是正确的”,因为初始条件为 false。然而,令人惊讶的是,实际输出是“1 是正确的。”
解释
解释在于浮点数的内部表示。在 C 中,浮点数在比较过程中会提升为双精度数,并且双精度数比浮点数更精确。因此,浮点型 0.7 与双精度型 0.7 并不完全相同。当 0.7(作为浮点数)提升为 double 时,它会变得略小于 0.7(作为 double)。
另一方面,0.5(作为浮点数)恰好是 double 的精确表示精确。因此,当条件b<1时,计算 0.5 时,它返回 false,因为 0.5(作为双精度数)不小于自身。
解决方案
要解决此问题,可以:
通过实现这些解决方案中的任何一个,您可以获得所需的输出“0 是正确的”。
以上是为什么 C 语言中的浮点比较有时会产生意外结果?的详细内容。更多信息请关注PHP中文网其他相关文章!