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?
印刷长度给出: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;
将此数字(0x5f3759df)添加到混音中。
打印长度* 100给出:17.0538 //近似值16.16
尝试不同的长度给出相同的结果。
例如:length = 100;结果是:10.3299 ?? //差不多......
答案 0 :(得分:13)