// 快速求平方根倒数算法的理解
float Q_rsqrt(float number)
{
long i;
float x2, y;
const float threehalfs = 1.5F;
x2 = number * 0.5F; // 将输入的浮点数除以2,相当于计算 x / 2
y = number;
i = *(long*)&y; // 使用类型转换将浮点数 y 的位模式解释为整数 i 的位模式
i = 0x5f3759df - (i >> 1); // what the fuck?
y = *(float*)&i;
y = y * (threehalfs - (x2 * y * y)); // 第一次迭代
// 后面的迭代次数可以省了,的带次数越多值越精确,但会牺牲速度
// y = y * (threehalfs - (x2 * y * y));
// y = y * (threehalfs - (x2 * y * y));
return y;
}
int main()
{
float te = 4.0;
float re0_5 = Q_rsqrt(te);
std::cout << "re0_5: " << re0_5 << std::endl;
float te2 = 16.0;
float re0_25 = Q_rsqrt(te2);
std::cout << "re0_25: " << re0_25 << std::endl;
float te3 = 25.0;
float re0_2 = Q_rsqrt(te3);
std::cout << "re0_2: " << re0_2 << std::endl;
return 0;
}
代码来源: https://www.bilibili.com/video/BV1v64y1i7KH/?from=search&seid=8429461669634567953&vd_source=b2e3e0d3ecd85a658aff526e8eb6bd39