gpt4 book ai didi

C++ 位移一个 float

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:11:17 26 4
gpt4 key购买 nike

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 并对其执行按位运算。我猜重点是通过避免分支来提高性能?

上面的代码失败了。谁能告诉我我做错了什么?我的印象是,它就像将 long 存储在 float 中并对其进行操作一样简单,这是错误的吗?

我发现了一些有趣的东西,如果我将代码更改为:

 float length =  32.32f;
long i = *(long*)&length ;
i = 0x5f3759df - ( i >> 1 );
length = *(float*)&i;

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

打印出 length*100 给出:17.0538//16.16 的近似值
尝试使用不同的长度会得到相同的结果。

例如:长度= 100;结果是:10.3299??//几乎...

最佳答案

32.32f的二进制是01000010000000010100011110101110

轮类后:00100001000000001010001111010111

您可以从 Wikipedia 中看到 float 是如何存储的.

符号:0

exp:01000010=66

尾数:00000001010001111010111=2-7(大约)

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

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

如果你对那个神奇数字为什么起作用感到奇怪:你可以仔细阅读维基页面或阅读这个 paper .

关于C++ 位移一个 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16908056/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com