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中文网其他相关文章!