在c++中计算两个浮点数之差时,y * (1 - x / y)是否优于y - x ?
Is y * (1 - x / y) better than y - x for computing the difference of two floating numbers in C++?
在c++中减去两个浮点数可能导致灾难性的取消。
在数值稳定性方面,用y * (1 - x / y)
代替y - x
有什么优势吗?
哈哈,没有。当你决定要找出两个数字之间的差时,如果这两个数字几乎相等并且远离0,就会发生灾难性的消去。不管你用多么古怪的公式来计算,精确计算差值所需的信息都已经被丢弃了。
为了避免这种情况,需要计算和存储不同的数字。也就是说,不是计算和存储x
和y
,而是计算a=x
和b=y-x
。或者a=(x+y)/2
和b=(x-y)/2
。您不会从 x
和y
中计算它们——这将有完全相同的问题——相反,您将计算并存储它们作为实际数字,并根据需要计算x
和y
。(显然,这需要a
和b
的选择,实际上可以计算,给定您的用例。)
你所说的"灾难性消去"我称之为Sterbenz定理:如果a/2 <= b <= 2a,则差值b-a
是完全可表示的。
"灾难性取消"这个词有点用词不当。减法是完全无害的;当你把你想要的数字四舍五入时,灾难已经发生了。
我认为乘法&除法会给你带来更多的麻烦,但是,在长版本中,你仍然减去两个浮点数。
从x-y得到的误差是y乘以从1-(x/y)得到的误差,然后再乘以y,得到相同的结果
相关文章:
- 编译器是否强制根据模板参数计算表达式?
- 是否有一种标准方法来计算两个 asctime() 值之间的天数
- 是否允许三元运算符在C++中计算两个操作数?
- 如何判断是否在编译时计算了"constexpr"(无需手动检查)
- 在C++中,是否可以编写一个条件的lambda,即只是一个计算结果为真或假的条件
- 委派的 ctor 是否受参数计算顺序的影响?
- OpenCV 检查计算机上是否安装了视频编解码器 (C++)
- 检查用户是否是 Windows 中本地计算机上的管理员C++
- 构造函数中初始化列表的计算顺序是否固定?
- 使用 OpenMP 并行执行比串行执行 c++ 花费更长的时间,我计算执行时间是否正确?
- 是否可以定义以后可以计算的布尔表达式
- (类型)(数学表达式)是否计算此类型的表达式?
- 有没有办法检查.exe(或进程)是否在远程计算机上运行
- 我是否应该在函数中使用静态变量来防止重新计算值
- 视觉 C++编译器在计算其参数之前是否允许将函数 ptr 存储在寄存器中?
- C++ std::string 中是否有任何函数可以计算两个字符串的相同起始字符的总数或任何最佳方法
- Opencv Sobel 算子是否计算相关性
- 是否计算二叉树中具有特定子级数量的节点
- 此方法是否计算空字符串
- PostgreSQL 是否计算嵌套的 BEGIN 和 END 语句,即使它不支持自治事务?