基礎から学ぶシステムトレード
シストレブログ人気ランキング  

シストレ徹底攻略シストレマスターへの道ワールド・トレーディング・エッジ基礎から学ぶシステムトレードシストレニュースシストレツールシストレナビTOPへ

 

2011年01月31日(月)

[MQL5]数値の誤差に関する注意点 [MQL5]



売買システムをEAとしてプログラミングする場合、テクニカル指標の条件分岐を行うことがよくあります。

通常は、

if(rsi > 70) ・・・
とか、
if(ma1 > ma2) ・・・
のように不等号を使って判別をします。ただ、場合によっては、
if(ma1 == ma2) ・・・
のように等号で判別する場合もあるかと思います。

二つの数値が等しいかどうかを判別する場合に注意することがあります。特に問題になるのは、整数intではなく、実数double の方です。

ここで簡単なサンプルプログラムをお見せします。a=0.1 として、a を10倍した値を2種類の方法で求めるプログラムです。一つは単純に10を掛けて10倍します。もう一つはaを10回足し合わせて10倍します。前者をs1、後者をs2という変数に計算し、それらを比較してみます。

void OnStart()
{
double a = 0.1;

double s1 = a * 10;
double s2 = 0.0;
for(int i=0; i<10; i++) s2 += a;

if(s1 == s2) Print("s1 == s2");
else Print("s1 != s2");

return;
}

さて、このs1とs2は全く同じ値でしょうか?同じであれば、「s1 == s2」と表示され、違っていれば、「s1 != s2」と表示されるはずです。

答えは、「NO」です。実はs1とs2は違った値となり、「s1 != s2」と表示されます。

実際にどんな値かは、

Print("s1=", s1);
Print("s2=", s2);

という行を追加して確認してみましょう。

すると、
s1=1
s2=0.9999999999999999
と表示され、確かに違っていることがわかります。

これはどうしてでしょうか?人が計算する場合、0.1を10倍しても、0.1を10回足しても、正確に1になりますよね。どうしてコンピュータはそんな人ができることを間違えるのでしょうか?

実はこのプログラム中で、a=0.1 と代入した時点で正確に0.1ではないのです。前回の記事のおまけで書いたことですが、実数doubleはデータ構造がM×2Eという指数表記になっています。つまり、小数点以下の数も2進数として表現されるので、例えば、1×2-1 = 0.5、1×2-2 = 0.25、1×2-3 = 0.125のように、正確に表現できる数は2のべき乗、あるいはそれを足し合わせた数だけなのです。

0.1という値は2のべき乗を足し合わせても正確に表せないので、a=0.1の時点でわずかに誤差があるのです。

では、掛け算で計算した場合と足し算を繰り返して計算した場合の違いは何でしょうか?それは計算の回数です。掛け算は1回だけに対して、足し算は10回行っています。実際には
s2 = 0+0.1
s2 = 0.1+0.1
s2 = 0.2+0.1
という風に誤差のある値同士の足し算を繰り返しています。その結果、わずかな誤差が積み重なって、コンピュータの中でも違う数値となってしまうのです。

ちなみに、上のプログラムで a=0.5 とか、a=0.25 にすると、誤差は発生せず、「s1 == s2」と表示されます。

人は10で掛けたり、割ったりするのがキリのいい数だと思っていますが、コンピュータの中でキリのいい数はで掛けたり、割ったりした数なのです。

人とコンピュータの間にはこのような「文化の違い」がある上、人は許容できる誤差もコンピュータは許容しないのです。

なので、実数の数値を等号で判別する場合、よほど条件が厳密に合わない限り、一致と判別されないということを理解しておく必要があるでしょう。


>>“基礎から学ぶシステムトレード”全記事バックナンバーはこちらから




Posted at 15時44分


ページのトップへ ページのトップへ

Sponsor AD

2011/1

            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          

プロフィール

豊嶋久道

2003年よりFX取引を始め、システムトレードの道へ。最近ではFXオプション取引も含めたトレーディングシステムの研究を行っている。システムトレードを基礎から正しく理解するための情報を発信する予定。

PHOTO

ランダムウォークとランダムトレード(6)

ランダムウォークとランダムトレード(6)

カテゴリーリスト

最近の記事

検索


当サイトコメントについて

当コメントは情報提供のみを目的として作成されたものであり、投資に関してはご自身でご判断くださいますようお願い致します。また、当資料は著作物であり著作権法により保護されております。無断で全文または一部を転載することはできません。

RSS1.0

[Login]


powered by a-blog
Copyright (C) 2008 PhiConcept,Inc. All rights reserved.