MQL4およびMQL5でDigits()をバイパスして任意の数値(引用符だけでなく)の小数点以下桁数を取得 - ページ 12

 
Ilya Malev:

これはおそらく最適なソリューションです

ダブルを等価に比較するのは正しくありませんし、また、符号を正確にする必要があります。

MT4のstdlib.mq4ファイルを見てください、正しい二重比較の例がありました。

CompareDoubles()

SZZ:こちらの記事をご覧くださいhttps://www.mql5.com/ru/articles/1561

Особенности работы с числами типа double в MQL4
Особенности работы с числами типа double в MQL4
  • www.mql5.com
При программировании на языке MQL4 у новичков порой возникают ситуации, когда результаты некоторых математических вычислений отличаются от ожидаемых. При этом программа компилируется и работает, но не так, как нужно. Они начинают разбираться в программе, находят новые "ошибки" в языке, реализации функций и т.п. В большинстве случаев последующий...
 
Aliaksandr Hryshyn:
対数、非整数での指数、三角法、......どうするんだろう。サードパーティライブラリ、インジケータを使用する。どれも誤差がある!

超メガ精度が必要な場合は、gnu mpのような特別な外部ライブラリを使用することができます。

そうでない場合、精度の保証が必要な場合(演算ごとに誤差を計算する場合)には、各種の「インターバルライブラリ」を使用する必要があります。

それでも足りない場合は、桁の代わりに多項式を使うことができます。

しかし、このような回路が実際にMTで使われているケースは見た ことがありません :-)

めにはめがねがある^^v)

 
Igor Makanu:

ダブルを等価に比較することは正しくありませんし、また、課題は符号を正確にすることです。

MT4のstdlib.mq4ファイルを見てください、正しい二重比較の例がありました。

CompareDoubles()

さて、CompareDoublesを使った場合の実行時間は2倍に跳ね上がります。それなら、こっちの方がいいんじゃない?

int dtd(double f)
 {
  f/=0.0000001;
 
  if(int(fmod(f,10000000))==0)
   {
    return 0;
   }
  if(int(fmod(f,1000000))==0)
   {
    return 1;
   }
  if(int(fmod(f,100000))==0)
   {
    return 2;
   }
  if(int(fmod(f,10000))==0)
   {
    return 3;
   }
  if(int(fmod(f,1000))==0)
   {
    return 4;
   }
  if(int(fmod(f,100))==0)
   {
    return 5;
   }
  if(int(fmod(f,10))==0)
   {
    return 6;
   }
  return 7;
 }
 
Ilya Malev:

さて、そんな中、CompareDoublesを使った実行時間は1/2に急増します。このようにしたほうがいい。

この例と、ループ内で DoubleToStr() を使用した例を比較し、違いがなければ、すべてが正しいということです。

ZS:私はfmod()で試してみました私は例を投稿したと思うが、それは0.07でチェックする必要がありますように、正しく動作しません - すぐにバグがポップアップ表示されます。

 
Igor Makanu:

あなたのコードをチェックすることはできませんが、難しいことではありません。ループ内でDoubleToStr()を使用した例とあなたの例を比較して、違いがなければ、すべてが正しいということです。

すでに確認し、速度を計算した結果、それがベストな方法だと思います。もちろん、7文字以上を探す必要がある場合は別ですが。

S.s. 0.7 と 0.07 と 500000000.0001 など、すべて正しく計算されています。

s.s. しかし、500000000.9991の場合は、もっとひどい処理になります。しかし、FXの実務ではほとんど関係ありません。

 
Ilya Malev:

しかし、FXの実務では、これはほとんど重要ではありません。

取引注文 の場合、この問題は無意味です。価格は桁数で正規化され、ロットは最小ロットに対する相対値です。

数理モデリングの問題であれば、役に立つかもしれません。

 
Igor Makanu:

もし、取引注文 であれば、このタスクは全く意味がありません。

数理モデルとの課題であれば、有効かもしれません。

もちろん、ニューラルネットワークを書くわけではありません =))) と言いながら、価格/ロット/お金を10進数の4バイト整数で格納すると、データサイズが2倍になって便利です。

 
Igor Makanu:

ダブルを等価に比較することは正しくありませんし、また、課題は符号を正確にすることです。

MT4のstdlib.mq4ファイルを見てください、正しい二重比較の例がありました。

CompareDoubles()

SZZ:こちらの記事でしたhttps://www.mql5.com/ru/articles/1561

そこで、xが何桁で正規化されるかを決めるのが課題である。だから大丈夫なんです。そんなハシゴを書くのが面倒なら別ですが。

 
Dmitry Fedoseev:

そんなハシゴを書くのが面倒なら別ですが。

ハシゴを使わなくてもできますが、1割ほど時間がかかります。

int dtd2(double f)
 {
  f/=0.0000001;
  int d = 0, i = 10000000;
 
  while( d < 7 && int( fmod( f, i ) ) > 0 )
   {
    i /= 10;
    d ++ ;
   }

  return d ;
 }
 
Ilya Malev:

ハシゴを使わなくてもできますが、1割ほど時間がかかります。

これは、f/=0.0000001;というのが疑問です。