ここ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
に正規化しライブラリが必要であることを確かめてください... 'double convert(int16_t x){return x <0? x/double(32768):x/double(32767);} ' 'std :: numeric_limits'を使って簡単にすべてのint型にテンプレート化して一般化することができます。とにかくそれは非常に短く、確かに標準ライブラリにはありません。こちらもご覧ください:http://stackoverflow.com/questions/929103/convert-a-number-range-to-another-range-maintaining-ratio – coyotte508
@ coyotte508私はまだそれを見つけられませんでしたが、私は本当に見ていた/標準ライブラリのstd :: numeric_limitsのように既にテンプレート化されていることを期待しています。これは、私がこれを必要とする唯一の人ではないことを知っているからです。私は自分のキャリアを書くのに費やしたことは、すでに標準化されているはずですが、最近、自分自身で書く前に、既存の標準化されたコードを見つけようとしていることを、ところで、リンクをありがとう。 – IntellectualKitty
私は通常は同意しますが、それが1行であれば、わかりやすく標準的な名前の関数呼び出しで囲まれているよりも "インライン"(現場)であることが明確です。ちなみに、質問に直角に、あなたはフロートを使いたいですか?精度は0から1までの範囲で非常に異なります。 –