同伴到hypot()

jjg*_*jjg 8 c algorithm geometry

hypot在1999年的语言修订版中引入C 的函数,在另一方作为参数的情况下,计算了直角三角形的斜边,但要注意避免因天真实现而导致的上下溢.

double hypot(double a, double b)
{
  return sqrt(a*a + b*b);
}
Run Code Online (Sandbox Code Playgroud)

我发现自己需要伴侣功能:给定一个边和三角形的斜边,找到第三面(避免在/溢出下).我可以想到几种方法来做到这一点,但想知道是否存在现有的"最佳实践"?

我的目标是Python,但实际上我正在寻找算法指针.


谢谢你的回复.如果有人有兴趣的结果,我的C99实现可以发现这里和Python版本在这里,部分的假设项目.

Rip*_*pi2 3

首先要做的是因式分解:

b = sqrt(h*h - a*a) = sqrt((h-a)*(h+a))
Run Code Online (Sandbox Code Playgroud)

我们不仅避免了一些溢出,而且还提高了准确性。

如果任何因子接近1E+154 = sqrt(1E+308)(IEEE 754 64 位浮点数的最大值),那么我们还必须避免溢出:

sqrt((h-a)*(h+a)) = sqrt(h-a) * sqrt(h+a)
Run Code Online (Sandbox Code Playgroud)

这种情况不太可能发生,因此两者sqrt都是合理的,即使它比sqrt.

请注意, if h ~ 5E+7 * athenh ~ b这意味着没有足够的数字来表示b与 不同h