级联hypot()是否安全?

nib*_*bot 6 c math floating-point

我想计算三维和四维向量的范数(长度).我正在使用双精度浮点数,并且要小心避免不必要的溢出或下溢.

C数学库提供hypot(x,y)计算二维向量的范数,小心避免中间计算中的下溢/溢出.

我的问题:使用hypot(x, hypot(y, z))hypot(hypot(w, x), hypot(y, z))分别计算三维和四维向量的长度是否安全?

Die*_*Epp 3

它很安全,但很浪费:您只需要计算sqrt()一次,但是当您级联 时hypot(),您将sqrt()每次调用hypot(). 通常我可能不关心性能,但这可能会降低结果的精度。你可以自己写:

double hypot3(double x, double y, double z) {
    return sqrt(x*x + y*y + z*z);
}
Run Code Online (Sandbox Code Playgroud)

等等。这会更快、更准确。我不认为任何人看到hypot3()你的代码时都会感到困惑。

标准库hypot()可能有避免溢出的技巧,但您可能不关心它。通常,hypot()比 更准确sqrt(x*x + y*y)。请参阅GLibC 源代码中的e_hypot.c 。

  • 对于“hypot3(DBL_MAX, 0.0, 0.0)”(溢出)、“hypot3(DBL_MIN, 0.0, 0.0)”(下溢)等,天真的实现失败。正如问题中所述,我想避免这种情况。 (3认同)