DoubleとFLOATの比較 - MathFloorの不明確なエラー - ページ 4 1234567 新しいコメント Vladislav Andruschenko 2017.02.26 09:22 #31 Andrey Dik: floatは数字の去勢であり、何のメリットもない。変換のロスをすべて処理し、可能な限り高い精度である2倍を使用した方が良い。 ありがとうございます。結局どこを間違えたのか、考えてみることにします。今のところfloatもまだ動いています。私は始めたことを諦める習慣がないんです。しかし、このエラーで私はバランスを崩した。 Andrey Dik 2017.02.26 09:26 #32 Vladislav Andruschenko: ありがとうございます。私のミスがどこにあったのか、考えてみます。一応、フロートは動いています。やめることに慣れてないんです。しかし、このエラーには度肝を抜かれた。 ただし、標準的な数学関数はすべて2倍数で動作し、2倍の結果を生成することに注意してください。これらの関数を float 数値に適用すると、内部で double に変換されるため、いずれにせよ精度と結果の妥当性は失われます。 個人的には、計算や数値の比較では、差と最小許容値を比較する方法は使わず、常に16番目の符号までは最大限の精度で作業し、最後の操作で正規化するようにしています。ダブルを正しく扱えば問題はないのですが、そうでない場合は、計算・変換のいずれかのステップで精度が 低下し、結果が歪むという問題が生じますので、そうされることをお勧めします。 Vladislav Andruschenko 2017.02.26 12:11 #33 Andrey Dik: ただし、標準的な数学の関数はすべて2倍数で動作し、2倍の結果が得られることに注意してください。これらの関数をfloatの数値に適用しても、内部的にはdoubleに変換されるため、いずれにしても得られる結果の精度や妥当性は失われることになります。 個人的には、計算や数値の比較では、差と最小許容値を比較する方法は使わず、常に16番目の符号までは最大限の精度で作業し、最後の操作で正規化するようにしています。あなたが正しくダブルで動作する場合、私はあなたを行うことをお勧めします、それ以外の場合は、計算/変換のいずれかのステップの精度の 低下に関連付けられた結果の歪みの問題が発生します。 包括的なご回答をありがとうございました。 Mikhail Dovbakh 2017.02.26 14:31 #34 2017年のレーティング価格は臆面もなく正解 Vladislav Andruschenko 2017.02.26 15:33 #35 Mikhail Dovbakh:2017年のレーティング価格は臆面もなく正解 教えてください。 Taras Slobodyanik 2017.02.26 16:03 #36 然もありなんdouble Averab=(Ask+Bid)/2/_Point;double AUTOPRICE=MathFloor( NormalizeDouble(Averab,2) )*_Point; Vladislav Andruschenko 2017.02.26 16:26 #37 Taras Slobodyanik:はこうでなければならない。double Averab=MathAbs(Ask-Bid)/2/_Point;double AUTOPRICE=MathFloor( NormalizeDouble(Averab,2) )*_Point;何度もコードを変えているんですね。私も同じことをしました。 実験して、doubleとintの意味を理解したのですが、明示的に計算すると、間違ったものが出てくるのです。1行目はご指摘の通りです。MathFloor( NormalizeDouble((Ask+Bid)/Point,_Digits) )*Point2017.02.26 18:24:59.133 2017.01.02 00:03:00 Exp - DOUBLE TEST MATHFLOOR EURUSD,M30: MathFloor=2.102872017.02.26 18:24:59.133 2017.01.02 00:03:00 Exp - DOUBLE TEST MATHFLOOR EURUSD,M30: DOUBLE askP2=105146 bidP2=105141 Averab2=105143.5000000000 AUTOPRICE=1.05143000002017.02.26 18:24:59.133 2017.01.02 00:03:00 Exp - DOUBLE TEST MATHFLOOR EURUSD,M30: FLOAT askP=105146 bidP=105141 Averab=105143.5000000000 AUTOPRICE=1.0514299870 Double vs FLOAT - どんな新人の質問でも、フォーラムを乱雑にしないように。プロフェッショナルは、通り過ぎないでください。Nowhere without you - Open Only back testing Taras Slobodyanik 2017.02.26 16:49 #38 ということは、105143.5000000000を 43に切り下げたものが正しい...(46-41)/2=2.5、切り捨て=2 Vladislav Andruschenko 2017.02.26 16:50 #39 Taras Slobodyanik:ということは105143.5000000000 切捨て 43は...(46-41)/2=2.5、切り捨て=2そうだが、スプレッドが異なる(2,3,4,5,6,7)場合、下方向の丸め方が異なり、かなり正確にならない場合があります。 Taras Slobodyanik 2017.02.26 16:52 #40 0から8までチェックしたところ、すべてOKでした。 1234567 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
floatは数字の去勢であり、何のメリットもない。変換のロスをすべて処理し、可能な限り高い精度である2倍を使用した方が良い。
ありがとうございます。私のミスがどこにあったのか、考えてみます。一応、フロートは動いています。やめることに慣れてないんです。しかし、このエラーには度肝を抜かれた。
個人的には、計算や数値の比較では、差と最小許容値を比較する方法は使わず、常に16番目の符号までは最大限の精度で作業し、最後の操作で正規化するようにしています。ダブルを正しく扱えば問題はないのですが、そうでない場合は、計算・変換のいずれかのステップで精度が 低下し、結果が歪むという問題が生じますので、そうされることをお勧めします。
ただし、標準的な数学の関数はすべて2倍数で動作し、2倍の結果が得られることに注意してください。これらの関数をfloatの数値に適用しても、内部的にはdoubleに変換されるため、いずれにしても得られる結果の精度や妥当性は失われることになります。
個人的には、計算や数値の比較では、差と最小許容値を比較する方法は使わず、常に16番目の符号までは最大限の精度で作業し、最後の操作で正規化するようにしています。あなたが正しくダブルで動作する場合、私はあなたを行うことをお勧めします、それ以外の場合は、計算/変換のいずれかのステップの精度の 低下に関連付けられた結果の歪みの問題が発生します。
2017年のレーティング価格は臆面もなく正解
2017年のレーティング価格は臆面もなく正解
然もありなん
double AUTOPRICE=MathFloor( NormalizeDouble(Averab,2) )*_Point;
はこうでなければならない。
double AUTOPRICE=MathFloor( NormalizeDouble(Averab,2) )*_Point;
何度もコードを変えているんですね。
私も同じことをしました。 実験して、doubleとintの意味を理解したのですが、明示的に計算すると、間違ったものが出てくるのです。
1行目はご指摘の通りです。
2017.02.26 18:24:59.133 2017.01.02 00:03:00 Exp - DOUBLE TEST MATHFLOOR EURUSD,M30: DOUBLE askP2=105146 bidP2=105141 Averab2=105143.5000000000 AUTOPRICE=1.0514300000
2017.02.26 18:24:59.133 2017.01.02 00:03:00 Exp - DOUBLE TEST MATHFLOOR EURUSD,M30: FLOAT askP=105146 bidP=105141 Averab=105143.5000000000 AUTOPRICE=1.0514299870
ということは、105143.5000000000を 43に切り下げたものが正しい...
(46-41)/2=2.5、切り捨て=2
ということは105143.5000000000 切捨て 43は...
(46-41)/2=2.5、切り捨て=2
そうだ
が、スプレッドが異なる(2,3,4,5,6,7)場合、下方向の丸め方が異なり、かなり正確にならない場合があります。