如何解决快速逆平方根算法是否比 C++ 的标准库 sqrt() 函数更快?
最近我偶然发现了这样的快速平方根反算法。
float inverse_rsqrt( float number )
{
const float threehalfs = 1.5F;
float x2 = number * 0.5F;
float y = number;
long i = * ( long * ) &y;
i = 0x5f3759df - ( i >> 1 );
y = * ( float * ) &i;
y = y * ( threehalfs - ( x2 * y * y ) );
return y;
我认为这是对我的光线追踪器的一个很好的优化,因为我必须规范化很多向量,而且我只需要换掉这段代码。
Vec3D normalize(Vec3D vector){
return vector/(sqrt((vector[0]*vector[0])+(vector[1]*vector[1])+(vector[2]*vector[2])));
}
但是,当我实现代码时,它最终花费了相同的时间。这是我使用的实现。
Vec3D normalize(const Vec3D& rhs) { // Normalize Vector
float num = rhs[0]*rhs[0]+rhs[1]*rhs[1]+rhs[2]*rhs[2];
const float threehalfs = 1.5F;
float y = num;
long i = * (long *) &y;
i = 0x5f3759df - (i >> 1);
y = * (float *) &i;
y = y*(threehalfs - ((num*0.5F)*y*y));
return rhs*y;
我想知道标准 c++ cmath 库中的 sqrt 函数是否与快速平方根反算法一样好,或者可能不是,我错过了一个关键细节。
注意:Vec3D 只是一个大小为 3 的向量,具有 x、y、z 参数,我重载了 * 运算符,以便当双精度数乘以向量时,它会取向量的标量倍数。
解决方法
很可能您的编译器甚至不使用 std::sqrt
。是的,你写了它,但这个规范化操作是一个众所周知的可以硬件加速的操作。 x86 现在有一个内置的逆 sqrt,这样不仅可以节省平方根,还可以用乘法代替除法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。