web-dev-qa-db-ja.com

最大のdouble値の無限大のモデリング

問題は、C++でdoubleデータ型の無限大をモデル化することです。ヘッダーファイルで必要なため、numeric_limitsなどの関数を使用できません。

最大値を表す定義された定数はありますか?

16
ashim

浮動小数点数(doubleなど)は、実際には正および負の無限大を保持できます。定数INFINITYはmath.hヘッダーにあるはずです。

標準的なダイビングを行って、テキストを見つけました:

4マクロINFINITYは、可能であれば、正または符号なしの無限大を表すfloat型の定数式に展開されます。それ以外の場合は、変換時にオーバーフローするfloat型の正の定数に。

セクション7.12 Mathematics <math.h>


そしてもちろん、無限大(これもmath.hにあります)をテストするためのヘルパー関数isinfがあります。

7.12.3.3 isinfマクロ

int isinf(実浮動x);

説明:isinfマクロは、引数の値が無限大(正または負)かどうかを判別します。まず、セマンティックタイプよりも広い形式で表現された引数がそのセマンティックタイプに変換されます。次に、決定は引数のタイプに基づきます。

戻り値:isinfマクロは、引数の値が無限の場合に限り、ゼロ以外の値を返します。

25
Lalaland

_numeric_limits_関数はすべてconstexprであるため、コンパイル時定数と同じように正常に機能します(現在のバージョンのC++を使用している場合)。したがって、std::numeric_limits<double>::infinity()はどのような状況でも機能するはずです。

古いバージョンを使用している場合でも、これはコンパイル時定数を必要としない場所であればどこでも機能します。使用にコンパイル時定数が本当に必要かどうかは、質問から明らかではありません。ヘッダーにあるだけで、必ずしもそれが必要になるわけではありません。

古いバージョンを使用していて、コンパイル時定数が本当に必要な場合は、cmath内のマクロINFINITYが機能します。実際には無限大のfloat値ですが、doubleに変換できます。

21
bames53

ヘッダーファイルでstd :: numeric_limitsを使用できない理由がわかりません。しかし、これもANSI Cから引き継がれています。

#include <cfloat>

DBL_MAX
9
Gerald

DBL_MAXを使用できます。これは、次のようにfloat.hにあります。

    #define DBL_MAX         1.7976931348623158e+308 /* max value */
1
Ajit Vaze

答えは " 42. ";)だと思った

この記事は興味深いかもしれません:

http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm

またはこれ:

http://www.cplusplus.com/reference/clibrary/cfloat/

MAXimum有限で表現可能な最大の浮動小数点数:

FLT_MAX  1E+37
DBL_MAX  1E+37
LDBL_MAX 1E+37  
1
paulsm4

たぶんあなたのC++環境であなたはfloat.h、参照 http://www.gamedev.net/topic/392211-max-value-for-double-/ (DBL_MAX)

1
Joop Eggen

Wikipedia から:

0x 7ff0 0000 0000 0000   = Infinity
0x fff0 0000 0000 0000   = −Infinity
1
fge

これはうまくいきませんか?

const double infinity =  1.0/0.0;
0
Pubby
#include <cmath>
...
double d = INFINITY;

<cmath>で定義されたINFINITYを見つけることができます( math.h ):

利用可能な場合、正または符号なしの無限大を表す、タイプfloatの定数式。そうでない場合、変換時にオーバーフローするタイプfloatの正の定数。

0
AusCBloke