首页  >  文章  >  后端开发  >  为什么 C 语言中 `0.3` 变成了 `0.2999999999999999889` ?

为什么 C 语言中 `0.3` 变成了 `0.2999999999999999889` ?

Linda Hamilton
Linda Hamilton原创
2024-11-04 12:03:29397浏览

Why Does `0.3` Become `0.2999999999999999889` in C  ?

C 中的浮点不精确

编程中的浮点运算涉及使用固定位数表示实数,从而导致潜在的不准确。本文解决了 C 浮点运算中的精度问题,例如以下代码:

<code class="cpp">double a = 0.3;
std::cout.precision(20);
std::cout << a << std::endl;

此代码输出 0.2999999999999999889,而不是预期的 0.3。此外,如果 a 与自身相加 50 次,结果将变为 15.000000000000014211,而不是预期的 15。

说明

浮点数的精度有限,由下式确定他们的位数。双精度浮点数的小数部分有 53 位,因此有效精度约为 15 位小数。

使用 std::cout. precision(20) 时,指示流显示 20 位小数精确。然而,a 的基础值只有 15 位精度。附加的数字用零填充,导致不准确。

第二个示例累积了重复添加的不准确度。由于浮点运算不具有关联性,稍微不同的加法序列可能会产生略有不同的结果。

解决方案

为了最大限度地减少精度损失,请不要设置 std:: cout. precision 高于数字类型的可用精度。这可以通过使用:

<code class="cpp">std::cout.precision(std::numeric_limits<double>::digits10);</code>

这将双精度浮点数的精度限制为 15 位。

但是,对于大量重复计算,仍然可能会出现累积误差。在这种情况下,建议使用替代技术,例如定点算术或使用带有整数分子和分母的分数。

以上是为什么 C 语言中 `0.3` 变成了 `0.2999999999999999889` ?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn