C 中的浮点精度
在 C 中,浮点数精确到一定的小数位数。但是,这种精度存在限制,可能会导致意外结果。
问题陈述
考虑以下代码片段:
<code class="cpp">double a = 0.3; std::cout.precision(20); std::cout << a << std::endl; // Print 0.2999999999999999889 double a, b; a = 0.3; b = 0; for (char i = 1; i <= 50; i++) { b = b + a; }; std::cout.precision(20); std::cout << b << std::endl; // Print 15.000000000000014211
如图所示,a 略小于 0.3,但乘以 50 时,b 略大于 15.0。这种与预期结果的偏差可以归因于浮点精度的限制。
解决方案
要获得正确的结果,避免设置精度高于数字类型的可用精度。以下修订后的代码片段演示了此方法:
<code class="cpp">#include <iostream> #include <limits> int main() { double a = 0.3; std::cout.precision(std::numeric_limits<double>::digits10); std::cout << a << std::endl; double b = 0; for (char i = 1; i <= 50; i++) { b = b + a; }; std::cout.precision(std::numeric_limits<double>::digits10); std::cout << b << std::endl; }</code>
此方法可确保将精度设置为双精度数据类型可用的最大值。需要注意的是,如果循环运行明显更多的迭代次数(例如 5000 次而不是 50 次),则无论精度设置如何,累积误差最终都会变得明显。这是浮点运算的固有限制。
以上是为什么 C 中的浮点运算会导致精度误差?的详细内容。更多信息请关注PHP中文网其他相关文章!