首页 > 后端开发 > C++ > 为什么 C 语言中的浮点比较有时会产生意外结果?

为什么 C 语言中的浮点比较有时会产生意外结果?

Mary-Kate Olsen
发布: 2024-12-17 01:21:25
原创
379 人浏览过

Why Does Floating-Point Comparison in C Sometimes Produce Unexpected Results?

浮点比较异常

浮点比较的概念可能会产生误导,尤其是在处理浮点数据类型时。考虑以下示例:

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(作为双精度数)不小于自身。

解决方案

要解决此问题,可以:

  1. 将 float 更改为 double:通过将 a 和 b 声明为双精度,确保它们在比较过程中不会提升,并且将获得预期的行为。
  2. 向文字添加 f 后缀:通过将后缀 f 附加到文字,您明确指示他们应该被视为浮动。这将防止在比较过程中提升为双打。

通过实现这些解决方案中的任何一个,您可以获得所需的输出“0 是正确的”。

以上是为什么 C 语言中的浮点比较有时会产生意外结果?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板