c++位移位浮点数
c++ bit shifting a float
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);
,那么您将看到它。一口>一口>
如果你对这些神奇的数字为什么有效感到奇怪:你可以仔细阅读维基页面或阅读这篇论文。
相关文章:
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 使用提升将数据从 PyObject 复制到浮点数 *
- 使用浮点数和双精度数的非常小数字的数学
- 使用英特尔内联函数将打包的 8 位整数乘以浮点数向量
- 如何在 c++ 中将小数点后两位数的浮点数分配给另一个浮点数
- 返回浮点数的小数位数
- txt 文件中浮点数的最大和最小值
- 为什么 std::cout 打印浮点数、双精度和长双精度到相同的小数精度?
- 将浮点数转换为无符号字符数组并打印出来
- 如何将时间字符串 (M:SS) 转换为浮点数
- 如何将浮点数(*)[6]转换为浮点**类型?
- C++将浮点数乘以分数
- 如何将浮点数转换为uint8_t?
- 将字符串转换为浮点数或整数,而无需使用内置函数(如 atoi 或 atof)
- 如何在C++(Arduino)中将浮点数组转换为字节数组
- 在数学上将浮点数四舍五入到 N 位小数
- Cython通过浮点数的最快方式,用于高频控制回路
- 复制 -nan 表示浮点数,AVX __m256 复制后显示 0