我想计算3维和4维 vector 的范数(长度)。我使用的是 double 浮点数,并且要小心避免不必要的上溢或下溢。

C数学库提供了用于计算二维 vector 范数的hypot(x,y),请注意避免在中间计算中出现下溢/上溢。

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

最佳答案

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

double hypot3(double x, double y, double z) {
    return sqrt(x*x + y*y + z*z);
}

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

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

关于c - 级联hypot()安全吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30199890/

10-14 08:44