将float缩放到unsigned int的完整范围

时间:2014-09-11 14:54:33

标签: c++ floating-point double type-conversion

我在(0,1)范围内有一个 double ,我想扩展到32位 unsigned int (0,0xFFFFFFFF)的整个范围

如何在C ++中执行此操作?我不关心边缘情况,只要结果没有任何令人讨厌的溢出。

由于

2 个答案:

答案 0 :(得分:2)

使用C ++ 11' s lround

的解决方案
uint32_t convert_to(double v) {
  return std::lround(v * std::numeric_limits<uint32_t>::max());
}

double convert_from(uint32_t v) {
  return static_cast<double>(v) / std::numeric_limits<uint32_t>::max();
}

没有lroundround() for float in C++):

uint32_t convert_to(double v) {
  return std::floor(v * std::numeric_limits<uint32_t>::max() + 0.5);
}

答案 1 :(得分:1)

嗯,你可以简单地做到这一点

unsigned int result = (unsigned int)std::floor( 
    std::numeric_limits<unsigned int>::max() * yourDoubleInRange01 );