簡體   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