繁体   English   中英

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

[英]Normalized Integer to/from Float Conversion

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

但是,我想尽可能使用标准方法,而不是重新发明轮子,所以我要寻找的是标准 C 或 C++ 头文件、Boost 库或其他一些小型、便携、易于合并的东西已执行这些转换的源。

这是使用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。

查看编译成功结果

我会质疑您的意图在这里是否正确(或者实际上是大多数答案的意图)。

由于您可能只是在处理诸如由 ADC 产生的“真实”值的整数表示之类的东西 - 我认为实际上表示的是 +32767/32768(不是 +1.0)的浮点分数通过整数 +32767,由于使用了 2 的补码运算,因此 +1.0 的值实际上无法以这种形式表示。

尽管为每个整数类型(包括有符号和无符号)执行此操作有点乏味,但手工编写仍然很容易。

您当然不需要为每个整数类型都这样做! 请改用<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.
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM