在 C++ 中进行数学运算时,浮点错误如何传播?

2023-11-23

假设我们声明了以下变量

float a = 1.2291;

float b = 3.99;

float变量的精度为 6,这(如果我理解正确的话)意味着计算机实际存储的数字与您想要的实际数字之间的差异将小于10^-6

这意味着两者a and b有一些误差小于10^-6

所以在电脑里面a实际上可能是1.229100000012123 and b可能3.9900000191919

现在假设您有以下代码

float c = 0;
for(int i = 0; i < 1000; i++)
      c += a + b;

我的问题是

will c最终结果的精度误差小于10^-6以及还是不?

如果答案是否定的,我们如何才能真正知道这个精度误差,以及如果您按照您希望的次数和顺序应用任何类型的操作,到底会发生什么?


float 变量的精度为 6,这(如果我理解正确的话)意味着计算机实际存储的数字与您想要的实际数字之间的差异将小于 10^-6

这意味着a和b都有小于10^-6的误差

The 10-6 figure is a rough measure of the relative accuracy when representing arbitrary constants as floats. Not all numbers will be represented with an absolute error of 10-6. The number 8765432.1, for instance, can be expected to be represented approximately to the unit. If you are at least a little bit lucky, you will get 8765432 when representing it as a float. On the other hand, 1E-15f can be expected to be represented with an absolute error of at most about 10-21.

所以在计算机内部 a 实际上可能是 1.229100000012123 而 b 可能是 3.9900000191919

不,抱歉,它的工作方式并不是您写下整个数字并为可能的错误添加六个零。可以通过计算 6 个零来估计误差leading数字,而不是从最后一位数字开始。在这里,您可能期望 1.22910012123 或 3.990000191919。

(实际上,您将准确地得到 1.2290999889373779296875 和 3.9900000095367431640625。不要忘记,表示误差可以是负数,也可以是正数,就像第一个数字一样。)

现在假设您有以下代码[...]

我的问题是

will c最终结果的精度误差是否也小于10^-6?

No. The total absolute error will be the sum of all the representation errors for a and b for each of the thousand times you used them, plus the errors of the 2000 additions you did. That's 4000 different sources of error! Many of them will be identical, some of them will happen to compensate each other, but the end result will probably not be to 10-6 relative accuracy, more like 10-5 relative accuracy (suggestion done without counting).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C++ 中进行数学运算时,浮点错误如何传播? 的相关文章

随机推荐

  • 从 GitHub 删除已关闭的拉取请求

    我不小心发出了错误的拉取请求 最终自己关闭了请求 它现在处于关闭状态 但可以通过直接 URL 访问并显示在我的活动栏上 有没有办法完全删除拉取请求 使其无法再通过 URL 访问或显示在您的活动历史记录中 您无法删除拉取请求yourself
  • 嵌套菜单(子菜单)

    我正在尝试实现子菜单 嵌套菜单 值得一提的是 我正在使用 Hydra 组件 并且之前没有 Redux 的经验 因为这个特定问题 几天前开始学习它 我已按照material ui 上提供的嵌套列表示例https material ui com
  • 如果没有“function”关键字,这个对象方法定义如何工作?

    我无意中遗漏了这一点 发现了这一点function关键词 通常情况下foobar下面模块中的方法将声明为foobar function arg1 但有趣的是 以下内容至少在某些浏览器中有效 例如Chrome版本44 0 2403 157 m
  • OS X 上 Pygame 的抗锯齿颜色错误

    我在运行 OS X 的 Macbook Pro 非视网膜 上使用 Pygame 当我尝试创建抗锯齿线条或圆圈时 它似乎显示为错误的颜色 这是一个例子 import sys pygame random math import pygame g
  • 登录 .Net Core 控制台应用程序无法正常工作

    我正在关注这个教程 https andrewlock net using dependency injection in a net core console application 并相应地安装了软件包 但日志没有在任何地方打印 这是我的
  • 猜测一个数字,只知道提议的数字是更低还是更高?

    我需要猜一个数字 我只能看看我提议的数字是更低还是更高 性能非常重要 所以我想到了以下算法 假设我要猜测的数字是 600 我从数字 1000 开始 或者为了获得更高的性能 使用之前数字的平均结果 然后我检查 1000 是否高于或低于 600
  • 集成 ASP.NET Identity 的最佳实践 - 它们存在吗?

    我在一个新网站中使用 ASP NET Identity 但似乎没有很多 任何 示例说明如何以解耦方式执行此操作 我不想要我的域模型DomainUser必须继承的类Microsoft AspNet Identity EntityFramewo
  • 查找浮点类型可以在不损失精度的情况下处理的最大整数大小

    Double 的范围大于 64 位整数 但由于其表示形式 其精度较低 因为 double 也是 64 位 因此无法容纳更多实际值 因此 当表示较大的整数时 整数部分的精度开始下降 include
  • 继续For循环

    我有以下代码 For x LBound arr To UBound arr sname arr x If InStr sname Configuration item Then here I want to go to next x in
  • 有没有办法忽略未使用的未定义引用?

    假设我有两个源文件 未定义错误 cpp include
  • Passport.js 和 process.next 在策略中打勾

    我在 NodeJS 中遇到了一些新问题 process nextTick 在passport js的一些策略代码示例中 我们可以看到 passport use new LocalStrategy function username pass
  • ASP Web Api - IoC - 解析 HttpRequestMessage

    我正在尝试使用 ASP NET WebAPI 设置温莎城堡 我还使用 Hyprlinkr 包 https github com ploeh Hyprlinkr 因此需要将 HttpRequestMessage 实例注入到我的控制器的依赖项之
  • 在能够处理其他消息之前初始化参与者

    我有一个演员创造了另一个演员 class MyActor1 extends Actor val a2 system actorOf Props new MyActor 123 第二个参与者在创建后必须初始化 引导 自身 并且只有在此之后它才
  • 如何向javascript对象中的一个键添加多个值

    我有一个对象var obj key1 value1 key2 value2 我想向 key1 或 key2 添加多个值或值数组 例如var obj key1 arrayOfValues key2 value2 是否可以 基本上我想将它发送到
  • 如何将包含对象的数组保存到用户默认值

    我的对象符合新的 Swift 4Codeable协议 如何将这些对象的数组保存在UserDefaults struct MyObject Codeable var name String var something String myObj
  • PHP Regex 使用 glob() 指定多个路径

    glob aaafolder php glob bbbfolder php glob cccfolder php 是否可以简化这个 glob aaafolder php bbbfolder php cccfolder php 上面没有返回任
  • C - 在函数中分配矩阵

    我正在尝试使用获取其维度和三重指针的函数来分配矩阵 我已经分配了一个 int 设置为 NULL 并且将其地址作为函数的参数传递 由于某种原因 这给了我一个内存访问冲突 void allocateMatrix int matrix int r
  • 使用 C# 连接到 PowerPivot

    是否可以连接到 Excel xlsx 文件中的 PowerPivot 模型 不托管在 SharePoint 网站上 只是本地文件 肯定是这样 因为 Tableau 可以做到 有人有任何线索吗 简短回答 Yes 长答案 Excel 或 PP
  • 在浏览器中反映 html 更改,无需重新启动express应用程序

    我有一个快速应用程序 我使用 swig 作为模板引擎 当我单击刷新时 是否可以在浏览器中反映我的 HTML 更改 我不想每次需要更改 HTML 时都重新启动服务器 我从中得到了解决方案link 我将管理程序模块安装为全局安装 npm ins
  • 在 C++ 中进行数学运算时,浮点错误如何传播?

    假设我们声明了以下变量 float a 1 2291 float b 3 99 float变量的精度为 6 这 如果我理解正确的话 意味着计算机实际存储的数字与您想要的实际数字之间的差异将小于10 6 这意味着两者a and b有一些误差小