web-dev-qa-db-ja.com

floatとdoubleの実際の最小/最大値は何ですか(C ++)

Floatに「FLT_MIN」と「FLT_MAX」の値を使用するための推奨事項を読みました。私がこれを行うたびに、コードブロックは

最大:3.40282e + 038分:1.17549e-038

これがどういう意味かわからないので、実際の値を取得しようとしました

最大:47.2498237715分:-34.8045265148

...しかし、これらは物事を明確にしません。

これが私のコードからの抜粋です

   char c;         // reserve: 1 byte, store 1 character (-128 to 127)
   int i;          // reserve: 4 bytes, store -2147483648 to 2147483657
   short int s;    // reserve: 2 bytes, store -32768 to 32767
   float f;        // reserve: 4 bytes, store ?? - ?? (? digits)
   double d;       // reserve: 8 bytes, store ?? - ?? (? digits)
   unsigned int u; //reserve: r bytes store 0 to 4294967295

   c = 'c';
   cout << c <<" lives at " << &c <<endl;

   i = 40000;
   cout << i <<" lives at " << &i <<endl;

   s = 100;
   cout << s <<" lives at " << &s <<endl;

   f = 10.1;
   cout << f <<" lives at " << &f <<endl;

   d = 10.102;
   cout << d <<" lives at " << &d <<endl;

   u = 1723;
   cout << u <<" lives at " << &u <<endl;

スニペットでは、たとえば-32768-32767などの短いintのmin-max値を明確に見ることができます。これらは適切な理解可能な値ですが、floatとintの場合、実際の値は明確ではありません。

5
user9318444

_std::numerics_limits_ヘッダーの_<limits>_クラスは、数値型の特性に関する情報を提供します。

浮動小数点型Tの場合、「最大」と「最小」のさまざまな意味で、型で表現できる最大値と最小値を次に示します。また、この回答ではdoubleと呼ばれる一般的なIEEE 754 64ビットバイナリタイプの値も含めています。これらは降順です:

  • Tが無限をサポートする場合、std::numeric_limits<T>::infinity()は表現可能な最大値です。もちろん、無限大です。タイプTが無限をサポートするかどうかは、_std::numeric_limits<T>::has_infinity_で示されます。

  • std::numeric_limits<T>::max()は最大の有限値です。 doubleの場合、これは2です1024−2971、約1.79769•10308

  • std::numeric_limits<T>::min()は、最小の正の正規値です。浮動小数点形式には、多くの場合、指数がこれ以上小さくならない間隔がありますが、仮数(数値の小数部分)はゼロに達するまで小さくなります。これには精度が犠牲になりますが、いくつかの望ましい数学的な計算特性があります。 min()は、この精度低下が始まるポイントです。 doubleの場合、これは2です−1022、約2.22507•10−308

  • std::numeric_limits<T>::denorm_min()は、正の最小値です。非正規値を持つ型では、非正規です。それ以外の場合は、std::numeric_limits<T>::min()と等しくなります。 doubleの場合、これは2です−1074、約4.94066•10−324

  • std::numeric_limits<T>::lowest()は最小の有限値です。通常、大きさが大きい負の数です。 doubleの場合、これは-(21024−2971)、約−1.79769•10308

  • _std::numeric_limits<T>::has_infinity_および_std::numeric_limits<T>::is_signed_がtrueの場合、-std::numeric_limits<T>::infinity()が最小値です。もちろん、負の無限大です。

あなたが興味を持つかもしれないもう一つの特徴は次のとおりです:

  • _std::numeric_limits<T>::digits10_は10進数の最大数であり、その桁数の10進数をTに変換してから、同じ数の10進数に戻すと元の数値が得られます。 doubleの場合、これは15です。
4

それはすべてnumeric_limitsにあります。

しかし、[〜#〜] beware [〜#〜]

何らかの理由で、std::numeric_limits<float>:min()は最小の浮動小数点数を返しません。代わりに、正規化された形式で表される最小の正の浮動小数点数を返します。最小値を取得するには、std::numeric_limits<float>::lowest()を使用します。子供じゃない同様に、他の浮動小数点型、つまりdoubleおよびlong double

http://en.cppreference.com/w/cpp/types/numeric_limits

4
Jive Dadson

わかった。ここから学んだこと(みんなに感謝します)とウェブの他の部分を使って、このような別の問題に遭遇した場合に備えて、2つの簡潔な要約を書きました。

C++では、10進数値を表現/保存する2つの方法があります。

フロートとダブル

フロートは以下からの値を保存できます:

  • -340282346638528859811704183484516925440.0000000000000000最低フロート
  • 340282346638528859811704183484516925440.0000000000000000最大フロート

Doubleは次の値を保存できます。

  • -17976931348623157081452742373170435679807056752584499659891747680315726078002853876058955863276687817154045895351438246423432132688946418276846754670353751698604991057655128207624549009038932894407586850845513394230458323690322294404000018418400000098192098209824981910871010878710981019で検索されました。

  • 17976931348623157081452742373170435679807056752584499659891747680315726078002853853858958955863276687817154045895351438246423432132688946418276846754670353751698604991057655128207624549009038932894407586850845513394230458323690322294816000085512424989810989720982498979819809810981098109810108710191010981010981098109810981098109810981098109898109898109898109898109898109898109898109898989898989898989898989898989898989898989898989898そう家族で家族写真

Floatの精度により、最大9桁(実数7桁、10進数から2進数への変換+2)の値を格納できます。

ダブルは、名前が示すように、フロートの2倍のpresciosnを格納できます。最大17桁まで保存できます。 (15桁の実数、10進数から2進数への変換+2)

例えば.

     float x = 1.426;
     double y = 8.739437;

小数と数学

Floatは7real10進数を運ぶことができ、doubleは15real小数点以下、計算を実行するとき、それらを印刷するには、適切な方法を使用する必要があります。

例えば

含める

typedef std::numeric_limits<double> dbl; 
cout.precision(dbl::max_digits10-2); // sets the precision to the *proper* amount of digits.
cout << dbl::max_digits10 <<endl; // prints 17.
double x = 12345678.312; 
double a = 12345678.244; 
// these calculations won't perform correctly be printed correctly without setting the precision.


cout << endl << x+a <<endl;

例2:

typedef std::numeric_limits< float> flt;
cout.precision(flt::max_digits10-2);
cout << flt::max_digits10 <<endl;
float x =  54.122111;
float a =  11.323111;

cout << endl << x+a <<endl; /* without setting precison this outputs a different value, as well as making sure we're *limited* to 7 digits. If we were to enter another digit before the decimal point, the digits on the right would be one less, as there can only be 7. Doubles work in the same way */

この説明はほぼ正確ですか?混乱した場合、標準として使用できますか?

3
user9318444

C++では、 std::numeric_limits この種の情報を取得するクラス。

has_infinitytrue(最近は基本的にどのプラットフォームでも使用できます)で、 infinity を使用して、以上の値を取得できます他のすべての値(NaNを除く)。その否定は負の無限大を与え、他のすべての値以下になります(NaNを再度除く)。

有限値が必要な場合は、 max を使用できます。これは他のすべての有限値以上であり、 lowest =、これは他のすべての有限値以下です。

やや紛らわしいことに、 min は実際には最小の正の正規化値を与えますが、これは整数型で与えるものと完全に同期していません(これを指摘してくれた@JiveDadsonに感謝します)。

0
Simon Byrne