首页 > 后端开发 > C++ > 为什么在 C 中比较浮点数和双精度文字会产生意外的结果?

为什么在 C 中比较浮点数和双精度文字会产生意外的结果?

DDD
发布: 2024-12-15 18:48:15
原创
498 人浏览过

Why does comparing floats to double literals in C produce unexpected results?

浮点比较难题

考虑以下 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 是正确的。”

解决方案

要解决此问题,您可以:
  • 更改变量 a 和 b 声明为双精度数,或
  • 更改文字 0.7 和 0.5指定为 float

以上是为什么在 C 中比较浮点数和双精度文字会产生意外的结果?的详细内容。更多信息请关注PHP中文网其他相关文章!

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