NormalizeDoubleのパラドックス

 

こんにちは。

このヘルプセクションをいくら読んでも、最後の端数の1がどこから来ているのかがわからないのです。

正規化された数値をPrint()でJournalに出力する場合、予想以上に小数点 以下が含まれる可能性があることに留意してください。例えば、こんな感じです。

double a=76.671;// 小数点以下3桁の正規化された数値
Print("Print(76.671)=",a);// そのまま 印刷
Print("DoubleToString(a,8)=",DoubleToString(a,8));// 指定された精度で印刷 する

がターミナルに出力されます。

DoubleToString(a,8)=76.67100000
Print(76.671)=76.67100000000001

 
transcendreamer:

おはこんばんちは

このヘルプセクションをいくら読んでも、最後の端数の1がどこから来ているのかがわからないのです。

正規化された数値をPrint()でJournalに出力する場合、予想以上に小数点 以下が含まれる可能性があることに留意してください。例えば、こんな感じです。

double a=76.671;// 小数点以下3桁の正規化された数値
Print("Print(76.671)=",a);// そのまま 印刷
Print("DoubleToString(a,8)=",DoubleToString(a,8));// 指定された精度で印刷 する

がターミナルに出力されます。

DoubleToString(a,8)=76.67100000
Print(76.671)=76.67100000000001

ダブルタイプは精度に限界があり、誤差が生じる可能性があります。

この記事をおすすめします: https://www.mql5.com/ru/articles/1561

Особенности работы с числами типа double в MQL4
Особенности работы с числами типа double в MQL4
  • 2009.11.02
  • MetaQuotes Software Corp.
  • www.mql5.com
В данной заметке собраны советы по решению наиболее часто возникающих ошибок при работе с числами типа double в программах на MQL4.
 
ENSED:

ダブルタイプは精度に限界があり、誤差が生じる可能性があります。

この記事をおすすめします: https://www.mql5.com/ru/articles/1561

おすすめがわかりました、ありがとうございます。

を出力する際にDoubleToStrを使用することができます。

が、そもそもあれがどこから出てきたのかが不明なのです

割り算・掛け算をやっていたら、OK、エラーになるんです。

しかし、私が自分で処方した定数で?

最初は この精度を持たない定数に対して丸めを使わなければならないことがわかりました。

そして最も重要なことは、double変数に実際に格納されているものへの信頼が損なわれてしまうことです!

 

ドキュメントより 引用

Необходимо помнить, что вещественные числа хранятся в памяти компьютера с некоторой ограниченной точностью в двоичной системе счисления, в то время как общепринятой в использовании является десятичная система счисления. Поэтому многие числа, которые точно записываются в десятичной системе, в двоичной системе можно записать только в виде бесконечной дроби.

例えば、0.3や0.7という数字はコンピュータの中では無限の分数として表現されるが、0.25という数字は2のべき乗として正確に記憶されるのである。

 

おもしろい

もう、MQLではなく、もっと深いところ、80年代規格のレベルにあるのではと推測しています

が、やはりとても不思議です...。

他のアプリケーション言語では見たことがない

MQL言語レベルでの回避策を用意するのが合理的でしょう。

 

で、以下のコードがなぜ 0000000001 のテールを出力するのか、まだ説明がつきません。

current=NormalizeDouble(GlobalVariableGet("Equity-"+portfolio_id),2);

text = "Positions closed at " + (string)current + " for portfolio: " + portfolio_name;

if(!automatic) MessageBox(text,""); else Print(text);

正規化を行ったため

と、まだ尾を引いている。

 
transcendreamer:

おもしろい

もう、MQLのことではなく、どこか80年代の水準より深いところにあるのだろうと推測しています

とはいえ、やっぱり不思議ですよね......。

他のアプリケーション言語では見たことがない

MQLのレベルで回避策を用意するのが妥当でしょう。

何がそんなに難しいんだ?

4桁までの精度が必要な場合。10000を掛け、端数を 捨て、10000で割る。

mqlの数学関数については、ドキュメントに記載されています。

 

text = "ポートフォリオ:" + "ポートフォリオ名 "のポジションは" + (string)current + "で終了しました。

DoubleTo String を current にすれば問題ない。

 

そう、丸めを強制する必要があることに、すでに気づいていたのです

NormalizeDoubleは 明らかに失敗しています。

 
transcendreamer:

そう、丸めを強制する必要があることに、すでに気づいていたのです

NormalizeDoubleが機能しないようです。

NormalizeDoubleはまさにこの方法で動作します(最初のMQLからずっとこの方法で動作しています)。

10の累乗を掛けて整数化し(端数部分を 切り捨て)、10の累乗で割った数

何が問題なのか?パターンを崩す?

 
stringo:

NormalizeDoubleは次のように動作します(最初のMQL以来、常にこのように動作しています)。

10 の累乗を掛けて整数化し(端数は 切り捨てる)、さらに 10 の累乗で割る。

何が問題なのか?パターンを崩す?

正規化してもテールがあるのがパターンブレイク!
理由: