エラー、バグ、質問 - ページ 2820

 
Kira27:

証明書で混乱しました)))

リファレンスには、インバーテッドコンマなしで書かれています。だから、そこに自分を置くのです。

 
ヒゲの質問です。しかし、この結果は理解できない。
void OnStart()
{
  Print(NormalizeDouble(1.79435, 5) == 1.79435); // false  
}
 
fxsaber:
ヒゲの質問です。しかし、この結果は理解できない。

正確なダブり比較をするな、イプシロンを使え」と100回言われました。私たちのドキュメントに含まれています。

0.3や0.7でも、あなたの認識とは比較にならないでしょう。それを受け入れて、乗り越えてください。あるいは、(例えばMTIで)学びに行く。

 
Slava:

正確なダブり比較をするな、イプシロンを使え」と100回言われました。私たちのドキュメントに含まれています。

ダブり比較のやり方はもちろん知っています。

0.3や0.7でも、あなたの認識とは比べものにならないでしょう。それを受け入れて、乗り越えてください。あるいは、(例えばMTIで)学んでくること。

Print(NormalizeDouble(0.3, 5) == 0.3); // true
Print(NormalizeDouble(0.7, 5) == 0.7); // true

Print(NormalizeDouble(0.12345, 5) == 0.12345); // true

質問を理解していない。

 
decimalだと楽なんだけど、遅いんだよね(
 
fxsaber:

もちろんダブり比較もできますよ。

質問を理解していない。

他にも微妙なところがあります。

実数を0.5倍したものと2.0倍したものでは、比較にならない場合があります。

 
Slava:

他にも微妙なところがあります。

実数に0.5を乗じても2.0で割った数値にならない場合がある。

それはそうですね。しかし、問題は、なぜ1.79435という数字が小数点以下5桁まで正規化されていないのか、ということだ。


ZS この質問の背景は。

テスターのSLが起動した。DEAL_PRICE = 1.79435, ORDER_PRICE_OPEN = 0(as in MT5), DEAL_COMMENT = "sl 1.79435".

SLを実行したときに滑りがあるかどうか知りたかったのです。そこで、単純にDEAL_PRICEとコメントにあった価格を比較してみました。私の目では価格が同じに見えますが、MQLではそうではないことがわかります。ようやく元の比較にたどり着きました。

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

エラー、バグ、質問

fxsaber, 2020.08.10 09:04

void OnStart()
{
  Print(NormalizeDouble(1.79435, 5) == 1.79435); // false  
}
 
fxsaber:

すべて真実です。しかし、問題は、なぜ1.79435という数字が小数点以下5桁まで正規化されていないのか、ということだった。


ZS 質問の背景

テスターのSLが起動した。DEAL_PRICE = 1.79435, ORDER_PRICE_OPEN = 0(as in MT5), DEAL_COMMENT = "sl 1.79435".

SLを実行したときに滑りがあるかどうか知りたかったのです。そこで、単純にDEAL_PRICEとコメントにあった価格を比較してみました。私の目では価格が同じに見えますが、MQLではそうではないことがわかります。結局、元の比較にたどり着いた。

申し訳ないが、そう言われるとなんだか不思議な気がする。


 
Alexey Viktorov:

申し訳ないが、そんなことを言われると、なんだか変な感じだ。

質問を繰り返す。

fxsaber:

1.79435という数値が小数点以下5桁まで正規化されていないのはなぜですか?

void OnStart()
{
  const double Norm = NormalizeDouble(1.79435, 5);
  
  Print((double)(string)Norm == Norm);    // false
  Print((double)(string)Norm == 1.79435); // true
}
 
fxsaber:

すべて真実です。しかし、問題は、なぜ1.79435という数字が小数点以下5桁まで正規化されていないのか、ということだった。

正規化は丸めではありません。

@Slava さんは、doubleの内部表現が異なると書いています。

#define  PRINT(EX) Print(#EX," = ",EX)
//+------------------------------------------------------------------+
void OnStart()
{
   union ULONG_DOUBLE
   {
      double d_value;
      ulong ul_value;
   }tmp;
   double NORM_DOUBLE   = NormalizeDouble(1.79435, 5);
   double CONST_DOUBLE  = 1.79435;
   
   PRINT(NORM_DOUBLE);
   tmp.d_value = NORM_DOUBLE;
   PRINT(LongToHex(tmp.ul_value));
   
   tmp.d_value = CONST_DOUBLE;
   PRINT(CONST_DOUBLE);
   PRINT(LongToHex(tmp.ul_value));
}
//+------------------------------------------------------------------+
string LongToHex(const ulong value)
{
   return(StringFormat("%llX", value));
}
//+------------------------------------------------------------------+

2020.08.10 13:33:37.737 tst_normalize (EURUSD,H1) NORM_DOUBLE = 1.79435

2020.08.10 13:33:37.737 tst_normalize (EURUSD,H1) LongToHex(tmp.ul_value) = 3FFCB5A858793DDA

2020.08.10 13:33:37.737 tst_normalize (EURUSD,H1) CONST_DOUBLE = 1.79435

2020.08.10 13:33:37.737 tst_normalize (EURUSD,H1) LongToHex(tmp.ul_value) = 3FFCB5A858793DD9


SZS: どこかに@Nikolai Semkoの 良い投稿がありました。彼はdoubleを使った作業方法についてとても良い説明をしていました。

UPD:https://www.mql5.com/ru/forum/1111/page2623#comment_14473837