我有一个z_f
介于 0.0f 和 1.0f 之间的浮点数,我想将其转换为保持排序顺序的无符号整数。
一个简单的方法可能是:
float z_f = 0.5;
unsigned int z_ui = (unsigned int) z_f*(MAX_UINT32);//Scale to full range of uint32
这行得通吗?
这会导致精度损失吗?有没有更好的方法来达到相同的结果?
类型转换(unsigned int) z_f
的优先级高于 binary *
,因此您实际上是在乘以MAX_UINT32
0 或 1。
有许多可能的值z_f
会映射到同一个整数(想想许多非常接近零的浮点数)。这可能会影响排序顺序。
@Oswald 还指出了优先级错误。
至于更好的方法,我不确定(除了将数字保持为浮点数)。
出于优先考虑,我首先会避免使用 C 风格的演员表。第二件事是,由于精度问题,您不想在 a 上执行此操作float
,而是在double
.
unsigned int z_ui
= static_cast<unsigned int>(satic_cast<double>(z_f)*MAX_UINT32);