double
問題は、データ型のC++で無限大をモデル化することです。ヘッダーファイルで必要なので、のような関数は使用できませんnumeric_limits
。
最大値を表す定義済みの定数はありますか?
浮動小数点数(doubleなど)は、実際には正と負の無限大を保持できます。定数INFINITYはmath.hヘッダーにある必要があります。
標準的なダイビングに行き、テキストを見つけました:
4マクロINFINITYは、可能であれば、正または符号なしの無限大を表すfloat型の定数式に展開されます。それ以外の場合は、変換時にオーバーフローするfloat型の正の定数になります。
セクションで7.12 Mathematics <math.h>
そしてもちろんisinf
、無限大をテストするためのヘルパー関数があります(これもmath.hにあります)。
7.12.3.3isinfマクロ
int isinf(real-floating x);
説明:isinfマクロは、引数値が無限大(正または負)であるかどうかを判別します。まず、セマンティックタイプよりも広い形式で表された引数がセマンティックタイプに変換されます。次に、引数のタイプに基づいて決定が行われます。
戻り値:isinfマクロは、引数に無限の値がある場合にのみ、ゼロ以外の値を返します。
numeric_limits
関数はすべてconstexprであるため、コンパイル時定数として問題なく機能します(現在のバージョンのC ++を使用していると仮定します)。したがってstd::numeric_limits<double>::infinity()
、どのような状況でも機能するはずです。
古いバージョンを使用している場合でも、コンパイル時定数を必要としない場所であればどこでも機能します。あなたの使用が本当にコンパイル時定数を必要とするかどうかはあなたの質問からは明らかではありません。ヘッダーにあるだけでは必ずしも必要ではありません。
古いバージョンを使用していて、コンパイル時定数が本当に必要な場合はINFINITY
、cmathのマクロが機能するはずです。これは実際にはfloat
無限大の値ですが、に変換できますdouble
。
ヘッダーファイルでstd::numeric_limitsを使用できない理由がわかりません。しかし、これはANSICから引き継がれたものでもあります。
#include <cfloat>
DBL_MAX
答えは「42.0」だと思いました;)
この記事は興味深いかもしれません:
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 ++環境では、 http://www.gamedev.net/topic/392211-max-value-for-double-/(DBL_MAX)float.h
を参照してください。
ウィキペディアから:
0x 7ff0 0000 0000 0000 = Infinity
0x fff0 0000 0000 0000 = −Infinity
DBL_MAXを使用できます。これはfloat.hに次のようにあります
#define DBL_MAX 1.7976931348623158e+308 /* max value */
#include <cmath>
...
double d = INFINITY;
あなたは( )INFINITY
で定義されているのを見つけることができます:<cmath>
math.h
float
可能な場合は、正または符号なしの無限大を表す型の定数式。float
それ以外の場合は、変換時にオーバーフローする型の正の定数。
これはうまくいきませんか?
const double infinity = 1.0/0.0;