如何将32位整数转换为32位浮点数以保持排序?

时间:2011-12-15 14:08:22

标签: c++

我有两个32位整数i1,i2,我需要转换为浮点数f1,f2,以保持它们的相对排序(即i1< i2 => f1< f2)

reinterpret_cast会不会这样做?还有更好的方法吗?

3 个答案:

答案 0 :(得分:3)

由于为NaN空间和无穷大保留的值,整数本身以比32位机器上的浮点相同的位宽存储更多信息。所以简而言之,无法做到。

int范围:-2,147,483,648至2,147,483,647 浮点精度:7位

我认为如果问题的性质以某种方式限制整数值的范围,那将是可能的。否则使用双精度值。它的尾数为15-16位。

请记住,在C ++中,int类型可以具有不同的范围,具体取决于您的本机指针大小。在16位机器上,int范围是-32k到+ 32k。

另外,请记住,即使在转换为浮动的场景中,也没有对两个(二进制)最低有效位的正确性的承诺。

http://steve.hollasch.net/cgindex/coding/ieeefloat.html

答案 1 :(得分:3)

如果整数值小于2 24 ,只需转换值:

float f1 = i1, f2 = i2;

对于较大的值,您将失去精度,两个不同的整数可能会转换为相同的浮点值。

另一方面,您可以复制位模式。如果您的浮点数是IEEE754,那么这需要符号位一致,并且两个整数都不代表某种形式的NaN。 (如果符号位不一致,则必须注意-0.f == +0.f:。)复制二进制表示:

float f1;
std::copy(reinterpret_cast<const char*>(&i1),
          reinterpret_cast<const char*>(&i1) + 4,
          reinterpret_cast<char*>(&f1));

答案 2 :(得分:1)

当您将int转换为float时,值通常不会更改,因此会保留相对顺序。

reinterpret_cast不能用于此目的,因为它仅适用于指针,例如。 G。将对象转换为一种“平坦”的内存表示,即即它复制位模式