2013-06-12 12 views
27

なぜnumeric_limits :: minはintに対して負の値を返しますが、たとえば、フロートとダブル?なぜnumeric_limits :: minはfloat/doubleのint値が正の値に負の値を返しますか?

#include<iostream> 
#include<limits> 

using namespace std; 

int main() { 
    cout << "int: " << numeric_limits<int>::min() << " " 
     << "float: " << numeric_limits<float>::min() << " " 
     << "double: " << numeric_limits<double>::min() << "\n"; 
    return 0; 
} 

出力:cppreferenceから

int: -2147483648 float: 1.17549e-38 double: 2.22507e-308 

が非正規化と浮動小数点型の数値型T

によって最小有限値の表現を返します。 、最小値は最小値 を返します。 rmalized value。 この動作は予期しない可能性があることに注意してください。特に整数型の場合の動作と比較した場合、、 に値未満の値がある場合は、 numeric_limits::lowestを使用してください。

分は有界型にのみ意味があり、 には無制限の符号なし型があります。すなわち、 の無限集合の負の値を表す型は意味をなさない最小値を持ちません。

+0

浮動小数点値の場合、minはその型によって正確に表現できる最小*正数*と定義されます。 –

答えて

30

は、定義により、フローティングタイプの、minタイプが符号化することができる最小正の値ではなく、最低を返します。

最小値を使用する場合は、代わりにnumeric_limits::lowestを使用してください。

ドキュメント:それはこの方法でhttp://en.cppreference.com/w/cpp/types/numeric_limits/min

なぜとして、私は唯一の標準委員会は、すべての異なるネイティブ型のために極端な値のすべての形態を表現する方法を持っている必要があることを推測することができます。積分型の場合、極値には最大正と最大負の2種類しかありません。浮動小数点数については、可能な限り小さいものがあります。

意味が少し混乱していると思うなら、私は同意します。 C標準の関連する#defineのセマンティクスは、ほとんど同じように混乱します。

+0

推測のおかげで。可能な限り小さなタイプの両方に関する情報が必要であることは意味があります。私はちょうどそれが同じ値を返すが、両方とも整数のために定義されていることは本当に奇妙であることがわかった。多分もっと深い理由があったと思った。 – gnzlbg

+4

@gnzlbg:私はcertianについて知らないが、単純に「それはCのことだった」より深い理由があるのか​​疑問だ。 –

+0

あなたはその "最小の正の値"について確信していますか? OPからの出力はintで負に見え、cppreference.comでは「最小有限値」と表示されます。私のコンパイラは(まだ)C++ 11に準拠していませんので、私は最低限使用できません:-( – craq

5

これは残念ですが、似たような名前の後ろには全く異なる意味があります。 DBL_MINとINT_MINがまったく同じ "問題"を持つCから少し持ち越されました。

多くのことはできないので、何を意味するのかを覚えておいてください。

関連する問題