質問
これは非常に単純な質問です(私はそう思います)、 変数型の制限を提供する STL ライブラリ メソッドはありますか (例: 整数) ? これらの制限がコンピューターによって異なることはわかっていますが、何らかの方法で制限を解除する方法があるはずですよね?
また、 変数型の制限を計算するメソッドを書くのは本当に難しいでしょうか?
ただ興味があるだけです!:)
ありがとう ;)。
解決
使用 std::numeric_limits
するます:
// numeric_limits example
// from the page I linked
#include <iostream>
#include <limits>
using namespace std;
int main () {
cout << boolalpha;
cout << "Minimum value for int: " << numeric_limits<int>::min() << endl;
cout << "Maximum value for int: " << numeric_limits<int>::max() << endl;
cout << "int is signed: " << numeric_limits<int>::is_signed << endl;
cout << "Non-sign bits in int: " << numeric_limits<int>::digits << endl;
cout << "int has infinity: " << numeric_limits<int>::has_infinity << endl;
return 0;
}
他のヒント
「正しい」答えがすでに与えられていることがわかります。使用 <limits>
そして魔法を起こしましょう。質問は次のようなものなので、私はその答えが満足できないと思いました。
変数型の制限を計算するメソッドを書くのは本当に難しいでしょうか?
答えは次のとおりです。整数型の場合は簡単ですが、浮動小数型の場合は困難です。これを行うには 3 つの基本的なタイプのアルゴリズムが必要です。符号付き、符号なし、および浮動小数点。それぞれに最小値と最大値を取得する方法が異なるアルゴリズムがあり、実際のコードには多少のいじりが含まれます。浮動小数点の場合は、浮動小数点と同じサイズの既知の整数型がない限り、ループする必要があります。タイプ。
というわけで、こちらです。
署名なしは簡単です。最小値はすべてのビットが 0 の場合、最大値はすべてのビットが 1 の場合です。
const unsigned type unsigned_type_min = (unsigned type)0;
const unsigned type unsigned_type_max = ~(unsigned type)0;
符号付きの場合、最小値は符号ビットが設定されているが他のビットがすべて 0 である場合、最大値は符号ビットを除くすべてのビットが設定されている場合です。型のサイズがわからないと、符号ビットがどこにあるのかわかりませんが、これを機能させるためにいくつかのビットトリックを使用できます。
const signed type signed_type_max = (signed type)(unsigned_type_max >> 1);
const signed type signed_type_min = (signed type)(~(signed_type_max));
浮動小数点の場合、制限は 4 つありますが、正の制限だけを知っていれば十分ですが、負の制限は符号を反転した正の制限にすぎません。浮動小数点数を表現する方法は潜在的に多数ありますが、(基数 10 ではなく) 2 進浮動小数点を使用する方法では、ほぼすべての人が IEEE 表現を使用しています。
IEEE 浮動小数点の場合、最小の正の浮動小数点値は、指数の下位ビットが 1 で、他のすべてのビットが 0 の場合です。最大の負の浮動小数点値は、これのビット単位の逆数です。ただし、指定された浮動小数点型と同じサイズであることがわかっている整数型がなければ、ループを実行する以外にこのビット操作を行う方法はありません。浮動小数点型と同じサイズであることがわかっている整数型がある場合、これを 1 回の操作として実行できます。
const float_type get_float_type_smallest() {
const float_type float_1 = (float_type)1.0;
const float_type float_2 = (float_type)0.5;
union {
byte ab[sizeof(float_type)];
float_type fl;
} u;
for (int ii = 0; ii < 0; ++ii)
u.ab[ii] = ((byte*)&float_1)[ii] ^ ((byte*)&float_2)[ii];
return u.fl;
}
const float_type get_float_type_largest() {
union {
byte ab[sizeof(float_type)];
float_type fl;
} u;
u.fl = get_float_type_smallest();
for (int ii = 0; ii < 0; ++ii)
u.ab[ii] = ~u.ab[ii];
return -u.fl; // Need to re-invert the sign bit.
}
(Cに関連するが、私は、これはまた、C ++にも適用されると思います)。
あなたはまた、缶のスクリプトである、「問い合わせを」試すことができますあなたのコンパイラのlimits.hに再作成します。 projetcのホーム・ページからの引用:
これは多くを決定するプログラムであります Cコンパイラの性質と それが上で実行しているマシン、など 署名された最小値と最大値[国連] の文字/ INT /長く、多くのプロパティ フロート/ [長い]ダブル、というように。
それはANSI Cを生成オプションとして、 float.hのとlimits.hにファイルます。
さらにオプションとして、それさえもチェック コンパイラは、ヘッダを読み出すこと ファイルを正しくます。
これは、コンパイラの良いテストケースで、 それは多くでそれらを行使するので そのような最小として限界値、 最大浮動小数点数
#include <limits>
std::numeric_limits<type>::max() // min() etc