39

numeric_limits::min が int に対して負の値を返すのに、float や double などに対して正の値を返すのはなぜですか?

#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;
}

出力:

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

cppreference から:

数値型 T で表現可能な最小の有限値を返します。

非正規化を伴う浮動小数点型の場合、min は正規化された正の最小値を返します。この動作は、特に整数型の min の動作と比較すると、予想外の場合があることに注意してください。それより小さい値がない値を見つけるには、 を使用します numeric_limits::lowest

min は、制限付きの型と制限なしの符号なし型の場合にのみ意味があります。つまり、負の値の無限のセットを表す型には、意味のある最小値がありません。

4

2 に答える 2

46

定義により、浮動小数点型の場合、は最小値ではなく、型がエンコードできる正の最小min値を返します。

最低値が必要な場合は、numeric_limits::lowest代わりに使用してください。

ドキュメント: http://en.cppreference.com/w/cpp/types/numeric_limits/min

なぜこのようになっているのかについては、標準委員会がすべての異なるネイティブ型の極値のすべての形式を表す方法を必要としていたと推測することしかできません。整数型の場合、極値は最大正と最大負の 2 種類しかありません。フロートの場合、別の方法があります。可能な限り最小です。

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

于 2013-06-12T16:14:14.010 に答える
6

残念ですが、似た名前の裏には全く違う意味が隠されています。これは、DBL_MIN と INT_MIN がまったく同じ「問題」を抱えている C から引き継がれたものです。

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

于 2013-06-12T16:20:01.007 に答える