問題は、C++でdouble
データ型の無限大をモデル化することです。ヘッダーファイルで必要なため、numeric_limits
などの関数を使用できません。
最大値を表す定義された定数はありますか?
浮動小数点数(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マクロは、引数の値が無限の場合に限り、ゼロ以外の値を返します。
_numeric_limits
_関数はすべてconstexprであるため、コンパイル時定数と同じように正常に機能します(現在のバージョンのC++を使用している場合)。したがって、std::numeric_limits<double>::infinity()
はどのような状況でも機能するはずです。
古いバージョンを使用している場合でも、これはコンパイル時定数を必要としない場所であればどこでも機能します。使用にコンパイル時定数が本当に必要かどうかは、質問から明らかではありません。ヘッダーにあるだけで、必ずしもそれが必要になるわけではありません。
古いバージョンを使用していて、コンパイル時定数が本当に必要な場合は、cmath内のマクロINFINITY
が機能します。実際には無限大のfloat
値ですが、double
に変換できます。
ヘッダーファイルでstd :: numeric_limitsを使用できない理由がわかりません。しかし、これもANSI Cから引き継がれています。
#include <cfloat>
DBL_MAX
DBL_MAXを使用できます。これは、次のようにfloat.hにあります。
#define DBL_MAX 1.7976931348623158e+308 /* max value */
答えは " 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
たぶんあなたのC++環境であなたはfloat.h
、参照 http://www.gamedev.net/topic/392211-max-value-for-double-/ (DBL_MAX)
Wikipedia から:
0x 7ff0 0000 0000 0000 = Infinity
0x fff0 0000 0000 0000 = −Infinity
これはうまくいきませんか?
const double infinity = 1.0/0.0;
#include <cmath>
...
double d = INFINITY;
<cmath>
で定義されたINFINITY
を見つけることができます( math.h
):
利用可能な場合、正または符号なしの無限大を表す、タイプ
float
の定数式。そうでない場合、変換時にオーバーフローするタイプfloat
の正の定数。