gpt4 book ai didi

c++ - 除法表达式的数值稳定性

转载 作者:搜寻专家 更新时间:2023-10-31 00:14:46 24 4
gpt4 key购买 nike

我偶然发现了这样的代码

double x,y = ...;
double n = sqrt(x*x+y*y);
if (n > 0)
{
double d1 = (x*x)/n;
double d2 = (x*y)/n;
}

我想知道这样一个表达式对于 xy 的小值的数值稳定性。

对于这两个表达式,lim (x->0, y->0) (...) = 0,所以从数学的角度来看,它看起来是安全的(提名人 O( x²) 而分母是 O(x))。

尽管如此,我的问题是:这段代码是否存在任何可能的数值问题?

编辑:如果可能的话,我想避免重写表达式,因为 n 实际上被使用了两次以上并保持可读性(在上下文中发生的事情相对清楚)。

最佳答案

如果xy 非常接近DBL_MIN,则计算是易受下溢或精度极度损失的影响:如果 x 是非常接近 DBL_MIN,例如 x * x 可能是 0.0,或者(对于稍大的值)它可能会导致所谓的逐渐下溢,精度极度下降:例如和IEEE 双(大多数,如果不是全部台式机和笔记本电脑),1E-300
* 1E-300
将是 0.0。显然,如果两者都发生这种情况* xy,你最终会得到 n == 0.0,即使 xy 都是正数。

在C++11中,有一个函数hypot,可以解决n 的问题;但是,如果 x * x0.0d1 仍将为 0.0;你可能会得到更好的结果 (x/n) * x(但我认为在某些情况下你可能会以 0.0 或逐渐下溢结束——我没有对其进行充分分析以确保)。更好的解决方案将以不同的方式缩放数据,以避免这种限制个案。

关于c++ - 除法表达式的数值稳定性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21903515/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com