web-dev-qa-db-ja.com

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

Whyがnumeric_limits :: minを実行する理由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;
}

出力:

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

cppreferenceから:

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

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

minは有界型と無有界の符号なし型に対してのみ意味があります。つまり、負の値の無限のセットを表す型には意味のある最小値がありません。

32
gnzlbg

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

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

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

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

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

37
John Dibling

残念なことですが、似たような名前の後ろには完全に異なる意味があります。これは、Cから少し引き継がれたもので、DBL_MINとINT_MINはまったく同じ「問題」を持っています。

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

5
Balog Pal