gpt4 book ai didi

c - 我什么时候应该在 sqrtl 上使用 hypot?

转载 作者:行者123 更新时间:2023-12-03 14:15:22 34 4
gpt4 key购买 nike

It's already discussed here那个hypotsqrt 慢因为它处理两个输入很大或很小的情况,所以 sqrt会错误地返回 inf 或 0。

然而,根据some test , hypot甚至比首先转换为更高的精度然后进行琐碎的计算并转换回来还要慢。

那么,在什么情况下我应该使用 hypot ?只有当没有更大的浮点类型和溢出是一个问题?

编辑:sqrtlhypot输入不同 a=1,b=1.8e-8 ,但是 sqrtl返回更准确的结果:

hypot 1.0
sqrtl 1.000000000000000222044604925031
exact 1.000000000000000161999999999999986878000000000002125764000...
1+eps 1.0000000000000002220446049250313080847263336181640625

显示了将 eps 添加到结果的确切行 here

最佳答案

函数 double hypot(double x, double y) 计算边为 xy 的直角三角形的斜边长度,或距离
来自原点的点 ( x , y )。使用此函数而不是直接公式 sqrt(x * x + y * y) 是明智的,因为错误是
小多了。事实上,对于某些参数值,平方可能会导致精度损失(如果值太小,平方会产生 0),或者值的无限结果太大。使用直接公式可能会产生不正确的结果,甚至不在预期范围内:max(|x|, |y|) <= hypot(x, y) <= sqrt(2) * max(|x|, |y|)
hypot() 使用替代公式来避免这些病态情况,但会牺牲一些性能,但是如果您知道您的参数不会导致精度损失或无限结果,并且您需要以牺牲正确性为代价的额外速度,则可以使用简单的公式 sqrt(x * x + y * y) .

根据经验,如果 xy 为零或者它们的绝对值在 1e-100 和 1e+100 和 1e-4 <= |x|/|y| <= 1e4 之间,sqrt 应该没问题。

在您的示例中, ba 相比非常小,导致精度完全丧失,因为 b*b a*aa*a + b*b 无法区分 {1104510746 } .使用 a*a 作为中间结果可以获得足够的额外精度,long double 可以用足够的精度表示,a*a + b*b 可以计算出有意义的结果。但是由于 sqrt 大约是 sqrt(1 + epsilon) ,所以结果无论如何都是可用的。

关于c - 我什么时候应该在 sqrtl 上使用 hypot?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61190844/

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