这里已经讨论过,hypot
比sqrt
慢,因为它处理当两个输入非常大或非常小时的情况,使得sqrt
会错误地返回inf或0。
然而,根据一些测试,hypot
甚至比首先转换为更高精度然后进行平凡计算和转换更慢。
那么,在什么情况下应该使用hypot
?只有当没有更大的浮点类型并且溢出是一个问题时吗?
编辑:sqrtl
和hypot
在输入a=1,b=1.8e-8
时有所不同,但sqrtl
返回更准确的结果:
hypot 1.0
sqrtl 1.000000000000000222044604925031
exact 1.000000000000000161999999999999986878000000000002125764000...
1+eps 1.0000000000000002220446049250313080847263336181640625
在结果中添加eps的确切行数在此处显示。
x <= hypot() <= y
是否成立?这不是一个平均。 - l4m2b
是原来的十分之一,即b=1.8e-9
,那么 (real)hypot(a,b)
就是1+1.6199999999999999986878000000000000021257639999999999e-18
,返回 1 是正确的。 - l4m2long double
的增加精度似乎已经足够了。 - chqrlie