c++位移位浮点数

c++ bit shifting a float

本文关键字:浮点数 c++      更新时间:2023-10-16
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。我试图理解代码的部分是长在一个浮点数被取出,按位操作是对它执行。我猜关键是通过避免分支来提高性能?

以上代码失败。谁能告诉我我做错了什么吗?在我的印象中,这就像在float中获得long存储并操纵它一样简单,这错了吗?

我发现了一些有趣的东西,如果我把代码改为:
 float length =  32.32f;
 long  i = *(long*)&length ;
 i  = 0x5f3759df - ( i >> 1 ); 
 length = *(float*)&i;

将这个数字(0x5f3759df)添加到组合中。

输出长度*100得到:17.0538//近似16.16
尝试不同长度的结果是一样的。

eg: length = 100;结果为:10.3299??//几乎……

32.32f的二进制是01000010000000010100011110101110

移位后:00100001000000001010001111010111

你可以从维基百科看到浮点数是如何存储的。

标志:0

经验值:01000010 = 66

尾数:00000001010001111010111 = 2 <一口> 7> p>结果= 2 <一口>(66 - 127) *(1 + 2 <一口> 7> -59> p>它不是零。如果您使用printf("%.40fn",x2);,那么您将看到它。

如果你对这些神奇的数字为什么有效感到奇怪:你可以仔细阅读维基页面或阅读这篇论文。