DoubleとFLOATの比較 - MathFloorの不明確なエラー - ページ 4

 
Andrey Dik:
floatは数字の去勢であり、何のメリットもない。変換のロスをすべて処理し、可能な限り高い精度である2倍を使用した方が良い。
ありがとうございます。結局どこを間違えたのか、考えてみることにします。今のところfloatもまだ動いています。私は始めたことを諦める習慣がないんです。しかし、このエラーで私はバランスを崩した。
 
Vladislav Andruschenko:
ありがとうございます。私のミスがどこにあったのか、考えてみます。一応、フロートは動いています。やめることに慣れてないんです。しかし、このエラーには度肝を抜かれた。
ただし、標準的な数学関数はすべて2倍数で動作し、2倍の結果を生成することに注意してください。これらの関数を float 数値に適用すると、内部で double に変換されるため、いずれにせよ精度と結果の妥当性は失われます。

個人的には、計算や数値の比較では、差と最小許容値を比較する方法は使わず、常に16番目の符号までは最大限の精度で作業し、最後の操作で正規化するようにしています。ダブルを正しく扱えば問題はないのですが、そうでない場合は、計算・変換のいずれかのステップで精度が 低下し、結果が歪むという問題が生じますので、そうされることをお勧めします。
 
Andrey Dik:
ただし、標準的な数学の関数はすべて2倍数で動作し、2倍の結果が得られることに注意してください。これらの関数をfloatの数値に適用しても、内部的にはdoubleに変換されるため、いずれにしても得られる結果の精度や妥当性は失われることになります。

個人的には、計算や数値の比較では、差と最小許容値を比較する方法は使わず、常に16番目の符号までは最大限の精度で作業し、最後の操作で正規化するようにしています。あなたが正しくダブルで動作する場合、私はあなたを行うことをお勧めします、それ以外の場合は、計算/変換のいずれかのステップの精度の 低下に関連付けられた結果の歪みの問題が発生します。
包括的なご回答をありがとうございました。
 

2017年のレーティング価格は臆面もなく正解

蛾のせいではなく、肥やしのせいだ...

 
Mikhail Dovbakh:

2017年のレーティング価格は臆面もなく正解

教えてください。
 

然もありなん

double Averab=(Ask+Bid)/2/_Point;
double AUTOPRICE=MathFloor( NormalizeDouble(Averab,2) )*_Point;
 
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) )*Point
2017.02.26 18:24:59.133 2017.01.02 00:03:00  Exp - DOUBLE TEST MATHFLOOR EURUSD,M30: MathFloor=2.10287
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

 
Taras Slobodyanik:

ということは105143.5000000000 切捨て 43は...

(46-41)/2=2.5、切り捨て=2


そうだ

が、スプレッドが異なる(2,3,4,5,6,7)場合、下方向の丸め方が異なり、かなり正確にならない場合があります。

 
0から8までチェックしたところ、すべてOKでした。