归一化整数到/从浮点转换

时间:2016-06-01 23:42:34

标签: c++ floating-point integer

我需要将规范化的整数值转换为实数浮点值和从实际浮点值转换。例如,对于int16_t,值1.0由32767表示,-1.0由-32768表示。虽然对于每个整数类型(包括有符号和无符号)执行此操作都有点乏味,但它仍然很容易手写。

但是,我希望尽可能使用标准方法而不是关闭并重新发明轮子,所以我要寻找的东西就像标准的C或C ++标题,Boost库或其他一些小的,已经执行这些转换的便携式,易于合并的源。

2 个答案:

答案 0 :(得分:8)

这是使用std::numeric_limits

的模板化解决方案
#include <cstdint>
#include <limits>

template <typename T>
constexpr double normalize (T value) {
  return value < 0
    ? -static_cast<double>(value) / std::numeric_limits<T>::min()
    :  static_cast<double>(value) / std::numeric_limits<T>::max()
    ;
}

int main () {
  // Test cases evaluated at compile time.
  static_assert(normalize(int16_t(32767)) == 1, "");
  static_assert(normalize(int16_t(0)) == 0, "");
  static_assert(normalize(int16_t(-32768)) == -1, "");
  static_assert(normalize(int16_t(-16384)) == -0.5, "");
  static_assert(normalize(uint16_t(65535)) == 1, "");
  static_assert(normalize(uint16_t(0)) == 0, "");
}

它处理有符号和无符号整数,0确实归一化为0。

View Successful Compilation Result

答案 1 :(得分:-2)

  

虽然为每个整数类型执行此操作有点乏味,但两者都有   签名和未签名,手写也很容易。

您肯定不需要为每个整数类型执行此操作!请改用<limits>

template<class T> double AsDouble(const T x) {
    const double valMin = std::numeric_limits<T>::min();
    const double valMax = std::numeric_limits<T>::max();
    return 2 * (x - valMin) / (valMax - valMin) - 1; // note: 0 does not become 0.
}