我有两个32位整数i1,i2,我需要转换为浮点数f1,f2,以保持它们的相对排序(即i1< i2 => f1< f2)
reinterpret_cast会不会这样做?还有更好的方法吗?
答案 0 :(得分:3)
由于为NaN空间和无穷大保留的值,整数本身以比32位机器上的浮点相同的位宽存储更多信息。所以简而言之,无法做到。
int范围:-2,147,483,648至2,147,483,647 浮点精度:7位
我认为如果问题的性质以某种方式限制整数值的范围,那将是可能的。否则使用双精度值。它的尾数为15-16位。
请记住,在C ++中,int类型可以具有不同的范围,具体取决于您的本机指针大小。在16位机器上,int范围是-32k到+ 32k。
另外,请记住,即使在转换为浮动的场景中,也没有对两个(二进制)最低有效位的正确性的承诺。
答案 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。将对象转换为一种“平坦”的内存表示,即即它复制位模式。