nib*_*bot 6 c math floating-point
我想计算三维和四维向量的范数(长度).我正在使用双精度浮点数,并且要小心避免不必要的溢出或下溢.
C数学库提供hypot(x,y)计算二维向量的范数,小心避免中间计算中的下溢/溢出.
我的问题:使用hypot(x, hypot(y, z))和hypot(hypot(w, x), hypot(y, z))分别计算三维和四维向量的长度是否安全?
它很安全,但很浪费:您只需要计算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 。
| 归档时间: |
|
| 查看次数: |
213 次 |
| 最近记录: |