为什么 C 有一个 `hypot` 函数?

now*_*wox 0 c optimization

显然可以在sqrt(x*x + y*y)不使用该hypot(x,y)函数的情况下进行计算。为什么这个功能是标准的一部分?

这与一些内部(基于硬件)优化有关吗?

dbu*_*ush 6

hypot函数在避免溢出的同时执行此计算。

C 标准的第 7.12.7.3p2 节关于hypot函数状态:

这些hypot函数计算 和 的平方x和的平方根y,没有过度上溢或下溢。可能会发生范围错误。


chu*_*ica 5

除了hypot(x,y)避免撤消溢出(@bush)并可能提供比 更准确的答案(@Ian Abbot)之外sqrt(x*x + y*y),还定义了一个微妙的极端情况。

\n

如果 std 库遵循 ANSI/IEEE 754 __STDC_IEC_559__定义,则

\n
\n

hypert(\xc2\xb1\xe2\x88\x9e; y) 返回 +\xe2\x88\x9e,即使 y 是 NaN。C17dr \xc2\xa7 F.10.4.3

\n
\n

sqrt(x*x + y*y)不会。

\n
\n

可能会有一个成本:为什么hypot()函数这么慢?。这是一个实施质量问题。

\n
\n

这是否与某些内部(基于硬件)优化有关?

\n
\n

@njuffa讨论了这个问题。

\n