首页 > 后端开发 > C++ > 正文

为什么 C 中的浮点运算会导致精度误差?

Mary-Kate Olsen
发布: 2024-11-04 13:06:02
原创
349 人浏览过

Why Does Floating-Point Arithmetic in C   Lead to Precision Errors?

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!