c ++位移一个浮点数

时间:2013-06-04 00:37:37

标签: 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?

印刷长度给出: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 ?? //差不多......

1 个答案:

答案 0 :(得分:13)

32.32f的二进制值为01000010000000010100011110101110

换班后:00100001000000001010001111010111

您可以从Wikipedia查看浮点数的存储方式。

征:0

EXP:01000010 = 66

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

所以结果= 2 (66-127) *(1 + 2 -7 )= 2 -59 (周围)< / p>

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

如果你对这些神奇的数字有用的原因感到奇怪:你可以仔细阅读维基页面或阅读paper