float length = 32.32f;
long i = *(long*)&length ; // casting a float pointer to a long pointer...
i >>= 1; // right shift i but 1 ... or div by 2
length = *(float*)&i; // is this necessary?
Run Code Online (Sandbox Code Playgroud)
印刷长度给出:0.0
最终结果应为:16.16;
这个想法来自http://en.wikipedia.org/wiki/Fast_inverse_square_root.我试图理解代码的部分是一个浮点数被取出并在其上执行按位运算.我猜这一点是通过避免分支来提高性能?
上面的代码失败了.谁能告诉我我做错了什么?我的印象是它就像在long
存储器中float
操作它一样简单,这是错误的吗?
我找到了一些有趣的东西,如果我将代码更改为:
float length = 32.32f;
long i = *(long*)&length ;
i = 0x5f3759df - ( i >> 1 );
length = *(float*)&i;
Run Code Online (Sandbox Code Playgroud)
将此数字(0x5f3759df)添加到混音中.
打印出长度*100给出:17.0538 //近似16.16
尝试不同长度给出相同的结果.
例如:长度= 100; 结果是:10.3299 ?? //差不多......