【MQL4定数】最大値・最小値の定数​

【辞書】MQLリファレンス

最大値・最小値の定数

最大値・最小値の定数は、データ型の最大桁数などを定数にしたものです。

プログラムを作成したときに、オーバーフローなどの不具合が発生したときには、データ型の最大値を超えている可能性があります。

その場合は、これらの定数で上限値を決めると良いでしょう。

 

最大値・最小値の定数

定数数値説明
CHAR_MIN-128char型の最小値
CHAR_MAX127char型の最大値
UCHAR_MAX255uchar型の最大値
SHORT_MIN-32768short型の最小値
SHORT_MAX32767short型の最大値
USHORT_MAX65535ushort型の最大値
INT_MIN-2147483648int型の最小値
INT_MAX2147483647int型の最大値
UINT_MAX4294967295uint型の最大値
LONG_MIN-9.22337e+18long型の最小値
LONG_MAX9.22337e+18long型の最大値
ULONG_MAX1.84467e+19ulong型の最大値
DBL_MIN0.00E-01double型の最小値(正数)
DBL_MAX1.7976931348623158e+308double型の最大値
DBL_EPSILON2.22E-16以下条件時のdouble型の最小値
1.0+DBL_EPSILON != 1.0
DBL_DIG15double型の精度(桁数)
DBL_MANT_DIG53double型の仮数部ビット数
DBL_MAX_10_EXP308double型の指数部最大数(10進数)
DBL_MAX_EXP1024double型の指数部最大数(バイナリ)
DBL_MIN_10_EXP-307double型の指数部最小数(10進数)
DBL_MIN_EXP-1021double型の指数部最小数(バイナリ)
FLT_MIN1.18E-38float型の最小値(正数)
FLT_MAX3.40E+38float型の最大値
FLT_EPSILON1.192092896e-07以下条件時のfloat型の最小値
1.0+FLT_EPSILON != 1.0
FLT_DIG6float型の精度(桁数)
FLT_MANT_DIG24float型の仮数部ビット数
FLT_MAX_10_EXP38float型の指数部最大数(10進数)
FLT_MAX_EXP128float型の指数部最大数(バイナリ)
FLT_MIN_10_EXP-37float型の指数部最小数(10進数)
FLT_MIN_EXP-125float型の指数部最小数(バイナリ)

 

最大値・最小値の定数の使い方

オーバーフローなどの不具合を回避するために使用することが多いでしょう。

大抵のロジックでは、オーバーフローは起こりませんが、ときどき発生するので、上限値を決めておくと良いでしょう。

例えば、以下のように使用します。

void OnInit() {
    for(int i = 0; i < INT_MAX; i++){
        Print(i);
    }
}

 

プログラム例

以下は、主要な最大値・最小値の定数をエキスパートログに出力するプログラム例です。

//+------------------------------------------------------------------+
//| 最大値・最小値の定数 プログラム例                                  |
//+------------------------------------------------------------------+
void OnInit()
{
    // --- 整数型の最大値・最小値 ---
    Print("=== 整数型の最大値・最小値 ===");
    Print("CHAR_MIN   = ", CHAR_MIN);
    Print("CHAR_MAX   = ", CHAR_MAX);
    Print("UCHAR_MAX  = ", UCHAR_MAX);
    Print("SHORT_MIN  = ", SHORT_MIN);
    Print("SHORT_MAX  = ", SHORT_MAX);
    Print("USHORT_MAX = ", USHORT_MAX);
    Print("INT_MIN    = ", INT_MIN);
    Print("INT_MAX    = ", INT_MAX);
    Print("UINT_MAX   = ", UINT_MAX);
    Print("LONG_MIN   = ", LONG_MIN);
    Print("LONG_MAX   = ", LONG_MAX);
    Print("ULONG_MAX  = ", ULONG_MAX);

    // --- 浮動小数点型の最大値・最小値 ---
    Print("=== 浮動小数点型の最大値・最小値 ===");
    Print("DBL_MIN     = ", DBL_MIN);
    Print("DBL_MAX     = ", DBL_MAX);
    Print("DBL_EPSILON = ", DBL_EPSILON);
    Print("DBL_DIG     = ", DBL_DIG);
    Print("FLT_MIN     = ", FLT_MIN);
    Print("FLT_MAX     = ", FLT_MAX);
    Print("FLT_EPSILON = ", FLT_EPSILON);
    Print("FLT_DIG     = ", FLT_DIG);

    // --- オーバーフロー防止の例 ---
    Print("=== オーバーフロー防止の例 ===");
    int value = 2147483640;
    int addValue = 100;

    // 加算前にオーバーフローをチェック
    if(value > INT_MAX - addValue)
    {
        Print("オーバーフローが発生するため加算しません");
        Print("現在値: ", value, " / 加算値: ", addValue, " / INT_MAX: ", INT_MAX);
    }
    else
    {
        value = value + addValue;
        Print("加算結果: ", value);
    }
}

 

実行結果

上記プログラムを実行すると、エキスパートログに以下のような内容が出力されます。

=== 整数型の最大値・最小値 ===
CHAR_MIN   = -128
CHAR_MAX   = 127
UCHAR_MAX  = 255
SHORT_MIN  = -32768
SHORT_MAX  = 32767
USHORT_MAX = 65535
INT_MIN    = -2147483648
INT_MAX    = 2147483647
UINT_MAX   = 4294967295
LONG_MIN   = -9223372036854775808
LONG_MAX   = 9223372036854775807
ULONG_MAX  = 18446744073709551615
=== 浮動小数点型の最大値・最小値 ===
DBL_MIN     = 2.2250738585072014e-308
DBL_MAX     = 1.7976931348623158e+308
DBL_EPSILON = 2.2204460492503131e-016
DBL_DIG     = 15
FLT_MIN     = 1.17549435e-038
FLT_MAX     = 3.40282347e+038
FLT_EPSILON = 1.19209290e-007
FLT_DIG     = 6
=== オーバーフロー防止の例 ===
オーバーフローが発生するため加算しません
現在値: 2147483640 / 加算値: 100 / INT_MAX: 2147483647

 

このように、最大値・最小値の定数を活用することで、オーバーフローを事前に検知し、プログラムの安全性を高めることができます。