double型には計算誤差が常につきまとう

アイキャッチ

NormalizeDouble関数を活用すべし

double型の計算誤差のお話です。

2/3を計算すると0.666…となりますが、どこかで見切りをつけなければなりません。無限には持てませんから。

その見切りが計算誤差となります。

double型の場合、小数点以下15桁目までが有効桁となります。

つまり、2/3の場合、0.666666666666667となります。

あれこれと計算(通常、割り算)しているとこのようなケースによく遭遇します。

具体例をあげられずに申し訳ないのですが、明示的に割り算していなくてもMQL4の標準関数を使っているだけで計算誤差が発生することもあります。

MQL4のdouble型の計算誤差については以下の記事でも取り上げられています。

対処方法としては、double型の変数を扱う際は、まめにNormalizeDouble関数で指定小数点桁数に丸めることですね。

特にdouble型同士をif文で比較する時は必須です。

そうしないと、プログラムは不一致と判定しているのにPrint文での出力値は同じになり、頭の中がはてなマークでいっぱいになることになります。

すんごい地味なことなんですけど、この問題は結構頻繁に発生しますので、くれぐれもご注意ください。

スポンサードリンク

ブログランキングに参加中!

ポチっとクリック頂けると励みになります♪
(クリックしてもランキング一覧が表示されるだけですが、それでOKです)

にほんブログ村 為替ブログ FX システムトレード派へ

2件のコメント

  • s

    MQL程度では気にすることは無いと思うけどね~

    金融プログラムならともかく

    むしろ最近はスワップが現在値に成るが故にバックテストでの誤差がデカくなりすぎる

    • りゅーき

      double型変数同士で一致の有無を比較する場合は、きちんと考慮しないと意図しない動作の原因となります。
      大小の比較の場合は、おっしゃる通り、そこまで気にする必要はないかと思います。
      ただし、そうであっても事象を理解した上で無視するのと無知ゆえに無視するのとでは結果は同じでも意味が変わってくると私は考えております。

コメントを残す



thirteen − 5 =