c ++位移一个浮点数

Ant*_*ndo 7 c++ bit-shift

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 ?? //差不多......

Say*_*iss 14

32.32f的二进制是01000010000000010100011110101110.

轮班后: 00100001000000001010001111010111

您可以看到维基百科如何存储浮点数.

签名:0

EXP:01000010 = 66

尾数:00000001010001111010111 = 2 -7(周围)

所以结果= 2 (66-127)*(1 + 2 -7)= 2 -59(左右)

它不是零.如果你使用printf("%.40f\n",x2);那么你会看到它.

如果您对这些神奇数字的工作原理感到奇怪:您可以仔细阅读维基页面或阅读本文.