hypot
函数在C语言的1999年修订版中引入,它计算给定其他边作为参数的直角三角形的斜边,但要小心避免由于简单的实现而导致的上溢/下溢
double hypot(double a, double b)
{
return sqrt(a*a + b*b);
}
我发现自己需要配套的功能:给定三角形的边和斜边,找到第三条边(避免低于/溢出)。我可以想出几种方法来做到这一点,但我想知道是否有现有的“最佳实践”?
我的目标是Python,但实际上我是在寻找算法指针。
谢谢你的回复。如果有人对结果感兴趣,可以在here和Python版本的here中找到我的C99实现,它是Hypothesis项目的一部分。
发布于 2018-03-10 00:13:29
首先要做的是因式分解:
b = sqrt(h*h - a*a) = sqrt((h-a)*(h+a))
我们不仅避免了一些溢出,而且还获得了准确性。
如果有任何因子接近1E+154 = sqrt(1E+308)
(IEEE75464位浮点数的最大值),那么我们也必须避免溢出:
sqrt((h-a)*(h+a)) = sqrt(h-a) * sqrt(h+a)
这种情况是不太可能的,所以两个sqrt
是合理的,即使它比sqrt
慢。
请注意,如果为h ~ 5E+7 * a
,则为h ~ b
,这意味着没有足够的数字来表示与h
不同的b
。
https://stackoverflow.com/questions/49191477
复制相似问题