同伴到hypot()

同伴到hypot(),第1张

概述在1999年的语言修订版中引入C语言的hypot函数计算了直角三角形的斜边,并将其他边作为参数,但要小心避免因天真实现而导致的上下溢. double hypot(double a, double b){ return sqrt(a*a + b*b);} 我发现自己需要伴侣功能:给定一个边和三角形的斜边,找到第三面(避免在/溢出下).我可以想到几种方法来做到这一点,但想知道是否存在现有的“最 在1999年的语言修订版中引入C语言的hypot函数计算了直角三角形的斜边,并将其他边作为参数,但要小心避免因天真实现而导致的上下溢.
double hypot(double a,double b){  return sqrt(a*a + b*b);}

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

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

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

解决方法 首先要做的是分解:
b = sqrt(h*h - a*a) = sqrt((h-a)*(h+a))

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

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

sqrt((h-a)*(h+a)) = sqrt(h-a) * sqrt(h+a)

这种情况非常不可能,因此两个sqrt是合理的,即使它比一个sqrt慢.

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

总结

以上是内存溢出为你收集整理的同伴到hypot()全部内容,希望文章能够帮你解决同伴到hypot()所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1238297.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存