给定表示IEEE 754浮点数的32位,如何使用整数或位操作将该数转换为整数(而不是使用机器指令或编译器操作进行转换)?
我有以下函数,但在某些情况下会失败:
输入:int x(包含IEEE 754格式的32位单精度数字)
if(x == 0) return x;
unsigned int signBit = 0;
unsigned int absX = (unsigned int)x;
if (x < 0)
{
signBit = 0x80000000u;
absX = (unsigned int)-x;
}
unsigned int exponent = 158;
while ((absX & 0x80000000) == 0)
{
exponent--;
absX <<= 1;
}
unsigned int mantissa = absX >> 8;
unsigned int result = signBit | (exponent << 23) | (mantissa & 0x7fffff);
printf("\nfor x: %x, result: %x",x,result);
return result;
7条答案
按热度按时间vx6bjr1n1#
C有“联合”来处理这种类型的数据视图:
z9smfwbn2#
&x
给出x的地址,因此具有float*
类型。(int*)&x
将该指针转换为指向int
的指针,即转换为指向int*
的事物。*(int*)&x
解引用该指针为int
值。在int
和float
具有不同大小的计算机上,它不会执行您所认为的操作。而且可能存在字节顺序问题。
该解用于快速平方根倒数算法。
7gyucuyw3#
yqhsw0fo4#
jljoyd4f5#
你可以使用一个引用来强制转换浮点数。这样的强制转换应该不会生成任何代码。
C++
输出:
如果你想要c++风格的类型转换,使用reinterpret_cast,就像这样。
它不适用于表达式,必须将其存储在变量中。
juzqafwq6#
你不能用这种方式(有意义地)将浮点数转换成“整数”(
signed int
或int
)。它可能最终具有整数类型,但实际上它只是IEEE754编码空间的索引,本身不是有意义的值。
您可能会认为
unsigned
int具有位模式和整数值的双重用途,但int
没有。还有platform issues,它对有符号整数进行位操作。
cyej8jka7#
将浮点数乘以一个你想要的因子。在这个例子中我乘以100,000,因为分数后面的5位小数在我的运算中有意义。
将其转换为字节,然后将它们相加,再除以100,000。