将范围限制浮点数转换为无符号整数维持排序顺序和精度?

时间:2013-10-31 15:38:53

标签: c++ c types casting

我有一个浮动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

这会起作用吗? 这会导致精度损失吗? 有没有更好的方法来实现相同的结果?

3 个答案:

答案 0 :(得分:2)

类型转换(unsigned int) z_f的优先级高于二进制*,因此您实际上将MAX_UINT32乘以0或1。

答案 1 :(得分:2)

z_f有许多可能的值会映射到同一个整数(想想很多浮点数非常接近于零)。这可能会影响排序顺序。

还有@Oswald指出的优先级错误。

至于更好的方法,我不确定(除了将数字保持为浮点数)。

答案 2 :(得分:0)

出于优先原因,我首先会避免使用C样式转换。第二件事是,由于存在问题,您不希望在float上执行此操作,而是在double中。

unsigned int z_ui 
                 = static_cast<unsigned int>(satic_cast<double>(z_f)*MAX_UINT32);