我想计算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/