首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >hypot()的伴侣

hypot()的伴侣
EN

Stack Overflow用户
提问于 2018-03-09 18:18:42
回答 1查看 445关注 0票数 8

hypot函数在C语言的1999年修订版中引入,它计算给定其他边作为参数的直角三角形的斜边,但要小心避免由于简单的实现而导致的上溢/下溢

代码语言:javascript
代码运行次数:0
运行
复制
double hypot(double a, double b)
{
  return sqrt(a*a + b*b);
}

我发现自己需要配套的功能:给定三角形的边和斜边,找到第三条边(避免低于/溢出)。我可以想出几种方法来做到这一点,但我想知道是否有现有的“最佳实践”?

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

谢谢你的回复。如果有人对结果感兴趣,可以在here和Python版本的here中找到我的C99实现,它是Hypothesis项目的一部分。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-10 00:13:29

首先要做的是因式分解:

代码语言:javascript
代码运行次数:0
运行
复制
b = sqrt(h*h - a*a) = sqrt((h-a)*(h+a))

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

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

代码语言:javascript
代码运行次数:0
运行
复制
sqrt((h-a)*(h+a)) = sqrt(h-a) * sqrt(h+a)

这种情况是不太可能的,所以两个sqrt是合理的,即使它比sqrt慢。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49191477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档