2017-01-05 8 views
1

私は最小/最大整数とダブル

-2147483648 
2147483647 
2.22507e-308 
1.79769e+308 

なぜ最小限のダブルません(-1)倍の最大のダブルですが出力次のコード

#include <iostream> 
#include <limits> 
using namespace std; 
cout << numeric_limits<int>::min() << endl; 
cout << numeric_limits<int>::max() << endl; 
cout << numeric_limits<double>::min() << endl; 
cout << numeric_limits<double>::max() << endl; 

を試してみましたか? Afaik for integersの場合、最初のビットは符号として使用されます(おそらく、最大整数の絶対値が最小整数の絶対値よりも小さいのでしょうか?)。どのように負のダブルスが記述されているのかというと、私にとっては8バイトのうちのどれもがサインの原因ではないように思えるからです。これまで、私は浮動小数点数が対称であると読んでいました。整数値も対称でなければならないので、私はこれをあまり理解していませんか?

誰もがアマチュアについてそれを説明できますか?そのような

+0

https://en.wikipedia.org/wiki/IEEE_floating_point#Basic_and_change_formats – Danh

+0

IEEE-754浮動小数点型は符号の大きさを使用しますが、整数は2の補数を使用します –

答えて

3

インテグラルタイプの場合、あなたの考えに反して、最初のビットが符号を表す必要はありません。そしてそれは間違いなく真実である現実の表現があります。

整数型が異なる大きさの最小値と最大値を持つ理由は、現在のコンパイラでの典型的な実装選択は、特定の数の整数型を表すことですビットの。可能な別個の値の数(異なる可能なビット値の組み合わせ)は、ビット数に合わせて2になります。そう8ビットsigned charが異なる値(8から2256を表すことができ、16ビットintは65536異なる値を表すことができ、32ビットintは14294967296異なる値を表すことができます。これらの値はすべて偶数であることに注意してください。表現可能な値の1つは0になり、奇数個の別個の値が残ります。最大値と最小値が同じではないという値を2倍にしなければならない(2つの異なるビットパターンが同じ値を表す)か、[実際には通常の実装方法の選択]のどちらかです。これはまた、偶然にも、std::numeric_limits::max()が符号なし整数型に奇数値を与える理由です。

浮動小数点の場合、min()の指定は最小正の値(最小の正の値)であり、max()が最大です。負の値を0から最も遠くにする場合は、(C++ 11以降)std::numeric_limits<float>::lowest()を使用します。

2

numeric_limits振る舞う:数値番号について

  • :minとmax可能な値は、浮動小数点数の場合
  • の範囲れる:分は可能な最小値であり、maxは最大可能値
あります

http://en.cppreference.com/w/cpp/types/numeric_limits/minを参照してください:

は最小を返します。 非正規化を持つ浮動小数点型の場合、minは最小値の を返します。この動作は予期しない可能性があります。具体的には、整数型のminの動作と比較した場合、 です。 に値未満の値がある場合は、 numeric_limits :: lowestを使用します。 minは有界型にのみ意味があり、 には無制限の符号なし型があります。すなわち、 の無限集合の負の値を表す型は意味をなさない最小値を持ちません。

cout << numeric_limits<double>::lowest() << endl; 

は(1.79769e+308