トップ  >  MQL4リファレンス  >  基本  >  データ型  > 浮動小数点数型[double , float]
スポンサーリンク
検索

↑の検索エンジンが表示されない人は、
↓の古い検索エンジンを使用して下さい。
カスタム検索
MQL4リファレンスツリー
浮動小数点数型[double , float]


浮動小数点型(double , float)は小数点以下の小さな値を表現する事が出来ます。

MQL4言語では2つの浮動小数点型が使用できます。
コンピュータ・メモリの実数表現のメソッドは、
IEEE754(浮動小数点数演算標準)によって定義されており、
プラットホーム・オペレーティングシステム・プログラミング言語から独立しています。

データサイズ
[Byte]
正数の最小値 正数の最大値 精度
[有効桁数)
float 4 1.175494351e-38 3.402823466e+38 7桁
double 8 2.2250738585072014e-308 1.7976931348623158e+308 15桁


doubleの名称はfloat型の精度が倍である事を意味します。

floatは精度が限定されていて十分な結果を得られない事がある為、ほとんどの場合doubleを使用します。
floatが使用される理由は、メモリの使用量がdoubleの半分だからです。
浮動小数点数型の大きな動的配列を使用する時、
限定された精度のデータを取り扱う場合にfloatを使用するとメモリ消費を抑えられます。


浮動小数点定数は、整数と小数点と少数で成り立ちます。
整数と少数は10進数の連続した数値で表します。

サンプルソース:
    double tmp_double;
    float  tmp_float;

    tmp_double = 12.111;
    tmp_double = -956.1007;

    tmp_float  = 0.0001;
    tmp_float  = 16;



    // 大きな配列を使用し、メモリ消費を抑えたい場合
    float  tmp_array_float[999999];             // 大きな配列を宣言
    ArrayInitialize( tmp_array_float , 0 ));  // 大きな配列を0で初期化
    float[0] = 0.25;                             // 精度の低いデータを代入



浮動小数点数型は、2進数の限られた精度でメモリに保存される事に注意しなければなりません。




小数点以下の誤差について

浮動小数点数型はIEEE754(外部リンク)のメソッドで実数を表現しており、
小数点以下の数値は近似値に丸められてしまい誤差が発生する場合があります。
なのでif文判定での等価判定や、整数型へキャストする場合は十分注意して下さい。


管理人の勝手なコメント:
極端な事を言えば、
2の累乗用いて小数点以下のデータを保存している為、精度の範囲内(2のべき乗(外部リンク))で割り切れる値は正確に保存されますが、 精度の範囲内で割り切れない値は誤差が生じます。

例えば 0.5 , 0.25 , 0.125・・・では誤差は生じません。
その組み合わせの0.75 , 0.625・・・でも誤差は生じません。

しかし、0.1 , 0.05 , 0.7等の値は循環小数(外部リンク)による誤差が発生し、
コンピュータは0.10000000000000001 , 0.050000000000000003 , 0.69999999999999996 という近似値で表現します。

あくまで極端な例です。厳密に言えばそんな単純ではありません。
詳細はIEEE754(外部リンク)を参照して下さい。

気をつけなければならないのは、近似値同士の値の算出結果をint型へのキャストMathFloor()で小数点以下を切り捨てる場合です。
サンプルソース:
  double temp_div = 0.7 / 0.1;
  Print( "0.7 / 0.1 = " , (int)temp_div);
結果
  0.7 / 0.1 = 6


これは近似値同士の除算によって算出結果も近似値になってしまう為、
0.69999999999999996 / 0.10000000000000001 = 6.9999999999999991

算出結果の近似値6.9999999999999991の小数点以下を切り捨てる事で結果が6になってしまいます。

解決策としては、除算の際に分子と分母を10倍する等の方法が一般的です。

サンプルソース:
  const double div_times = 10;
  double temp_div = ( 0.7 * div_times) / ( 0.1 * div_times );
  Print( "0.7 / 0.1 = " , (int)temp_div);
結果
0.7 / 0.1 = 7


サンプルソース:
    double tmp_double_a;
    double tmp_double_b;
    double tmp_double_c;
    double tmp_double_div;
    
    // 割り切れる除算結果を保存
    tmp_double_div = 4.0;

    tmp_double_a   = 1 / tmp_double_div;    // 除算結果:0.25
    tmp_double_b   = 2 / tmp_double_div;    // 除算結果:0.50
    tmp_double_c   = 3 / tmp_double_div;    // 除算結果:0.75

    if ( ( tmp_double_a + tmp_double_b) == tmp_double_c ) {
        Print("一致");                      // 一致する
    } else  {
        Print("不一致");
    }


    // 割り切れない除算結果を保存
    tmp_double_div = 3.0;

    tmp_double_a   = 1 / tmp_double_div;    // 除算結果:0.3333333333333333
    tmp_double_b   = 4 / tmp_double_div;    // 除算結果:1.333333333333333
    tmp_double_c   = 5 / tmp_double_div;    // 除算結果:1.666666666666667

    if ( ( tmp_double_a + tmp_double_b) == tmp_double_c ) {
        Print("一致");
    } else  {
        Print("不一致");                   // 不一致になる
    }




スポンサーリンク
スポンサーリンク


Copyright ©2015 MT4でEA自作しちゃお~ All Rights Reserved.


Top

inserted by FC2 system