我需要将标准化整数值与实际浮点值相互转换。例如,对于 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。
View Successful Compilation Result https://ideone.com/4kIJtU
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)