我需要将规范化的整数值转换为实数浮点值和从实际浮点值转换。例如,对于int16_t,值1.0由32767表示,-1.0由-32768表示。虽然对于每个整数类型(包括有符号和无符号)执行此操作都有点乏味,但它仍然很容易手写。
但是,我希望尽可能使用标准方法而不是关闭并重新发明轮子,所以我要寻找的东西就像标准的C或C ++标题,Boost库或其他一些小的,已经执行这些转换的便携式,易于合并的源。
答案 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。
答案 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.
}