web-dev-qa-db-ja.com

C / C ++の最小double値

C(++)プログラムで最小の負の値を表す標準的な方法および/または移植可能な方法はありますか(負の無限大を使用するなど)?

Float.hのDBL_MINは、最小の数値です。

76
Will

-DBL_MAXANSI Cの場合 。float.hで定義されています。

118
dfa

浮動小数点数(IEEE 754)は対称であるため、最大値(_DBL_MAX_または numeric_limits<double>::max() )を表すことができる場合は、マイナス記号を付加するだけです。

そして、それがクールな方法です。

_double f;
(*((long long*)&f))= ~(1LL<<52);
_
70
fortran

Cでは、

#include <float.h>

const double lowest_double = -DBL_MAX;

C++ pre-11では、使用

#include <limits>

const double lowest_double = -std::numeric_limits<double>::max();

C++ 11以降では、

#include <limits>

constexpr double lowest_double = std::numeric_limits<double>::lowest();
39
rubenvb

これを試して:

-1 * numeric_limits<double>::max()

参照: - numeric_limits

このクラスは、各基本型に特化されており、そのメンバーは、その型がコンパイルする特定のプラットフォームで持つプロパティを定義するさまざまな値を返すか設定します。

32
Andrew Hare

実際の無限大または最小の有限値を探していますか?前者の場合、使用

_-numeric_limits<double>::infinity()
_

次の場合にのみ機能します

_numeric_limits<double>::has_infinity
_

それ以外の場合は、使用する必要があります

_numeric_limits<double>::lowest()
_

これはC++ 11で導入されました。

lowest()が利用できない場合、フォールバックできます

_-numeric_limits<double>::max()
_

これは、原則としてlowest()と異なる場合がありますが、実際には通常は異なりません。

20
Christoph

真にポータブルなC++ソリューション

C++ 11からは numeric_limits<double>::lowest() を使用できます。標準に従って、それはあなたが探しているものを正確に返します:

_y < x_に他の有限値yが存在しないような有限値x。
_is_bounded != false_のすべての専門分野で意味があります。

オンラインデモ


移植性のないC++の回答がたくさんあります。

-std::numeric_limits<double>::max()には多くの答えがあります。

幸いなことに、ほとんどの場合にうまく機能します。浮動小数点エンコーディングスキームは仮数と指数の数値を分解し、それらのほとんど(たとえば、人気のある IEEE-754 )は仮数に属さない明確な符号ビットを使用します。これにより、符号を反転するだけで、最大の正を最小の負に変換できます。

enter image description here

なぜこれらはポータブルではないのですか?

この規格は、浮動小数点規格を課していません。

私の議論が少し理論的であることに同意しますが、一部のエキセントリックなコンパイラーメーカーは、 2の補数 のいくつかのバリエーションでエンコードされた仮数を持つ革命的なエンコード方式を使用すると仮定します。 2の補数エンコーディングは対称ではありません。たとえば、符号付き8ビット文字の場合、正の最大値は127ですが、負の最小値は-128です。したがって、いくつかの浮動小数点エンコードが同様の非対称動作を示すと想像できます。

私はそのようなコード化スキームを知りませんが、ポイントは標準が符号反転が意図した結果をもたらすことを保証しないということですしたがって、この人気のある答え(ごめんなさい!)は、完全にポータブルな標準ソリューションとは見なせません!/*少なくとも_numeric_limits<double>::is_iec559_がtrueであると断言しなかった場合はそうではありません* /

9
Christophe
- std::numeric_limits<double>::max()

うまく動作するはずです

数値の制限

7
MadH

元の質問は無限に関するものです。だから、なぜ使用しないのですか

#define Infinity  ((double)(42 / 0.0))

iEEEの定義によると?もちろんそれを否定することができます。

1
Norbert