mt5ストラテジーテスターのティック - ページ 9

 
WhooDoo22:

こんにちは、MQL5コミュニティです。

テスターでストラテジーを実行した際、以下のような数値に遭遇した方はいらっしゃいますか?-1.000000000006551e-005と1.000000000006551e-005(そうです、ゼロが11個です)です。特定のダブルフォーマット型に違いないのですが、どのようなダブルフォーマット型なのでしょうか、うーん?

また、MQL5のドキュメントを読んでいると、標準のintデータ型は最小値が-2 147 483 648、最大値が2 147 483 647で、もちろん最小値が0、最大値が4 294 967 295のunsigned intデータ型はありますが、 ;) 最小値がマイナス-4 294 967 295 、最大値が 0という intデータ型はないようで、こういう最小値と最大値のintデータ型があると思いましたがそういうことだったのですね。前述したことは、他のデータ型にも適用できるかもしれません。

ありがとうございました。

0.00001は1e-5と同じ指数形式です。 最後の桁、6551は0.0000000000006551と同等で、これが倍数の比較に問題がある理由です。これを読んで、必要なら調べて、何が起こっているのか理解する必要があります。
Can price != price ? - MQL4 forum
  • www.mql5.com
Can price != price ? - MQL4 forum
 
RaptorUK:
0.00001は1e-5と同じ指数形式です。 末尾の余分な桁、6551は0.0000000000006551と同等で、これが2重比較に問題がある理由です....これを読んで、必要なら調べて、何が起こっているのか理解する必要があります。

Simonです。

私はこのスレッドを読んでいて、mql4スレッドの投稿者の二重比較の一般的な解決策は、正しい値を返すためにこれらの二重を適切に丸める方法を発見して利用することだと信じています。これに対してあなたはどう思いますか?

ありがとうございました。

 
WhooDoo22:

Simonです。

私はこのスレッドを読んでいて、mql4スレッドの投稿者の二重比較の一般的な解決策は、正しい値を返すためにこれらの二重を適切に丸める方法を発見して利用することだと信じています。このことについてどう思いますか?

ありがとうございます。

上の投稿の文脈では、2重の比較は重要ではなく、2重を単純に比較できない理由を理解することが重要なのです。
 
RaptorUK:
上記のあなたの投稿の文脈では、二重計算の比較は重要ではなく、二重計算を単純に比較できない理由を理解することが重要なのです。

なぜかというと価格値は4桁と5桁のフォーマットで返されると思うからです(USDJPYのように2桁と3桁の価格値を返す例外はありますが)。必要以上に長引かせたくないので、一度だけ分解してみることにします。

USDCHFの買値は現在0.92909で、MetaTrader5がこれらの価格値を計算するのは小数点以下16桁までだと思いますが、もしそうならUSDCHFの価格0.9290900000000000の計算には下9桁以降11桁が投入されていることになります。倍々計算が単純に比較できないのは、価格の小数点の右側の残りの場所(端末で読める場所ではなく、端末で読めない場所)が不等号の問題を引き起こすからだと思います。

ありがとうございました。

 
WhooDoo22:

なぜか?価格値は4桁と5桁の形式で返されると思うからです(USDJPYのように2桁と3桁の価格値を返す例外はあります)。必要以上に長引かせたくないので、一度だけ分解してみようと思います。

USDCHFの買値は現在0.92909ですが、MetaTrader5がこれらの価格値を計算するのは小数点以下16桁までだと思います。もしそうなら、USDCHFの価格0.9290900000000000の計算には最後の9桁以降11桁が投入されています。2倍が単純に比較できないのは、価格の小数点の右側の残りの箇所(端末で読める箇所ではなく、端末で読めない箇所)が不等号の問題を引き起こすからだと思います。

ありがとうございました。

doubleの問題は、その2進数表現にあります。2進数表現が正確でない2倍があり、1.000000000006551e-005のようなものが出てきます。詳しい 説明は省きますが、興味のある方はこちらを ご覧ください。
Double-precision floating-point format - Wikipedia, the free encyclopedia
Double-precision floating-point format - Wikipedia, the free encyclopedia
  • en.wikipedia.org
Double-precision floating-point format is a computer number format that occupies 8 bytes (64 bits) in computer memory and represents a wide dynamic range of values by using floating point. Computers with 32-bit storage locations use two memory locations to store a 64-bit double-precision number (a single storage location can hold a...
 
WhooDoo22:

なぜでしょうか?

1.57373 という値は実際には 1.5737300000000001 という double 値として保持されるかもしれませんが、NormalizeDouble(1.57373, 5) は 1.573739999 という double 値を生成するかもしれません。573729999999 両方の値は最も近い5桁目に丸められた値で等しいですが、直接比較すると等しくありません ... これは、double 値がどのように保存されるか、それらは浮動小数点数(浮動小数点数について調べ、読んで理解します)であり、しばしば保持されている値は、あなたが保持していると思う値とは全く同じではありません。

つまり、あなたのコメントでは2つの倍数の引き算を示していますが、その差は1.0000000000xyz -e5と表示されています。これは、倍数が浮動小数点数という 方法で保存されているからです。

Articles - Understanding Floating Point Number Representation - Cprogramming.com
Articles - Understanding Floating Point Number Representation - Cprogramming.com
  • www.cprogramming.com
Floating point representations vary from machine to machine, as I've implied. Fortunately one is by far the most common these days: the IEEE-754 standard. This standard is prevalent enough that it's worthwhile to look at it in depth; chances are good you'd be able to use this information on your platform (look for ieee754.h). An IEEE-754...
 
angevoyageur:
doubleの問題は、その2進数表現にあります。正確な2進数表現ができない2倍算があるので、1.000000000006551e-005のようなものが出てくる。詳しい 説明は省きますが、例えば次の ようなものがあります。

1.000000000006551e-005の10進数の右16桁目はe-005です。

1.000000000006551e-005は10進数の右16位が整数でなくe-005だから正確な2進数表現ができないとでも言うのか?


"詳しい説明は省きます"

なぜいけないのでしょうか?もし、詳しい説明を書きたいのであれば、ぜひ書いてください。


"興味があれば、例えばこれを読む ことができます。"

と読み始めています。

ありがとうございました。

Double-precision floating-point format - Wikipedia, the free encyclopedia
Double-precision floating-point format - Wikipedia, the free encyclopedia
  • en.wikipedia.org
Double-precision floating-point format is a computer number format that occupies 8 bytes (64 bits) in computer memory and represents a wide dynamic range of values by using floating point. Computers with 32-bit storage locations use two memory locations to store a 64-bit double-precision number (a single storage location can hold a...
 
WhooDoo22:


"ここでは詳しい説明 には立ち入らない"

なぜダメなのでしょうか?もし詳しい説明を書きたいのであれば、ぜひそうしてください。


浮動小数点数はその一つです
DYOR
DYOR
  • acronyms.thefreedictionary.com
What does DYOR stand for?
 
WhooDoo22:

1.000000000006551e-005の小数点の右16桁目はe-005です。

1.000000000006551e-005は10進数の右16位が整数でなくe-005だから正確な2進数表現ができないとでも言うのですか?


私のリンクとRaptorUKのリンクを読めば、それがより明確になるでしょう。そうでない場合は、もう一度読んでみてください :-D

1.000000000006551e-005は0.0000100000006551の別の表記に過ぎません。

 
RaptorUK:

1.57373 という値は実際には 1.5737300000000001 という double 値として保持されるかもしれませんが、 NormalizeDouble(1.57373, 5) は 1.573730000001 という double 値を生成するかもしれません。573729999999 両方の値は最も近い5桁目に丸められた値で等しいですが、直接比較すると等しくありません ... これは、double 値がどのように保存されるか、それらは浮動小数点数(浮動小数点数について調べ、読んで理解します)であり、しばしば保持されている値は、あなたが保持していると思う値とは全く同じではありません。

このコメントでは、2つの倍数の引き算を表示していますが、その差は 1.0000000000xyz -e5 と表示されています。これは、倍数の格納方法が浮動小数点数 であるためです。

1.57373(無視)

1.5737300000000001

1.5737299999999999

"最も近い5桁目に丸められた両方の値が等しい"

5桁目に丸められた両方の値は1.57373に等しい。


"しかし直接比較すると等しくない"

そうですね、違いがありますから。


"このように2倍の値が格納される"

1.5737300000000001 のような double 値は 1.57373 として保存されます (normalize double が使用されている場合だと思います)。normalize doubleが使われていない場合、double値1.5737300000000001はこの値形式を維持しますよね?


"そして多くの場合、保持されている値は、あなたが考えている値とは全く同じではありません。"

私の最後の発言は、この発言にも対応しています。


教えていただいたリンク先を読んでみます、ありがとうございました。

ありがとうございます。