MQL4マスターに質問です。ダブルコンペアについてもう一度。

 
こんにちは。
ご存知のように、計算の正しさだけでなく、書かれたコードの信頼性も、プログラミングのスタイルやコード内の整頓に左右されます。
私たちはおもちゃを書くわけではないので、書かれた プログラムの信頼性が第一条件です。ほとんどの計算がダブリングで行われ、そのコードでの正しい比較は
の2つの実数をプログラムコードで表現するには、一定のアプローチと精度が必要です。
私は、「正しい」プログラミングのスタイルを考えようとしているので、このような質問をしました。

式の場合

ダブルエー
ダブルビー

if(a==b) or if(a!=b)
{......} {......}

開発者が推奨するのはこれ
//+------------------------------------------------------------------+
//| 実数の比較関数。
//+------------------------------------------------------------------+
bool CompareDouble(double 数値1, double 数値2)
{
bool Compare = NormalizeDouble(Number1 - Number2, 8) == 0;
return(Compare)です。
}
//+------------------------------------------------------------------+


このコードは正しいですか?

ダブルエー
ダブルビー

if(a>b) if(a<b)
{......}{......}


一般的なケースでは、ほとんどないでしょう。正しい確認方法を教えてください。
一般的には、どのようなスタイルでダブリングに取り組むのが適切でしょうか。
回答してくださった皆様、ありがとうございました。
 

可能な限り、大きな桁と小さな桁で比較するのが望ましいですね。

double a;
double b;
 
if(a>b)             if(a<b)
    {......}            {......}

そのため、ある桁まで2倍になることをあまり気にする必要はありません。

Vol = 156.00000002; 
NormVol = NormalizeDouble(Vol,2); 
156.00

数字を並べることが必要な場合

if(a==b)    или         if(a!=b)
    {......}                    {......}

であれば、まず両方の数字をドット以降の1桁に変換します。

  a = NormalizeDouble(Vol1,2);
  b = NormalizeDouble(Vol2,2);
if(a==b)    или         if(a!=b)
    {......}                    {......}
 
xeon:

まず、両方の数字をドットの後に同じ数字に変換します。

  a = NormalizeDouble(Vol1,2);
  b = NormalizeDouble(Vol2,2);
if(a==b)    или         if(a!=b)
    {......}                    {......} 
また、指標で計算する 場合は、Normalizeやそれに類する準備をするのでしょうか?
私はプログラミングを勉強中で、たくさんのコードに目を通していますが、インジケーターのコードにはほとんど見当たりません。それが、「どうしたらちゃんとできるのか」という問題なのです。
 
VBAG:
xeon

まず、両方の数字をドットの後に同じ数字に変換します。

  a = NormalizeDouble(Vol1,2);
  b = NormalizeDouble(Vol2,2);
if(a==b)    или         if(a!=b)
    {......}                    {......} 
インジケーターの計算でNormalizeと同様の準備を行っていますか?
私はプログラミングを勉強中で、たくさんのコードに目を通していますが、インジケーターのコードにはほとんど見当たりません。それが、「どうしたらちゃんとできるのか」という問題なのです。

NormalizeDoubleや"<"">"の記号を使うと、インジケータやスクリプト、Expert Advisorのダブルに矛盾が生じる可能性があるので、なるべく避けるようにしています。
 
xeon ,
ご意見ありがとうございました。
 
常にノーマライズすれば、ダブりの問題は発生しない!;)
どんな比較でも、どんなダブりでも、そして意図的に選ばれた正確さで。

//--- NormalizeDouble
double nd( double value, int precision )
{
    return( NormalizeDouble( value, precision ) );
}
 
//--- MathAbs
double abs( double value )
{
    return( MathAbs( value ) );
}
 
//--- Если value1 равняется value2 до precision знака после запятой, возвращает true, иначе - false.
bool equal( double value1, double value2, int precision = 8 )
{
    return( nd( abs( nd( value1, precision ) - nd( value2, precision ) ), precision ) < nd( MathPow( 0.1, precision ), precision ) );
}

イコール ファンクションに注目 - 少しでも変更された場合。
bool equal( double value1, double value2, int precision = 8 )
{
    return( nd( abs( value1 - value2 ), precision ) < nd( MathPow( 0.1, precision ), precision ) );
}
(比較の前に各数値の正規化を取り除く)と、異なる結果が得られるでしょう。

例えば、equal( 0.123456784, 0.123456776 ) は最初のケースではtrueを 返しますが、2番目のケースではfalseを 返します ;)
 
komposter:
常にノーマライズすれば、ダブりの問題は発生しない!;)
しかし、性能上の問題が出てきます。倍精度との数値比較の問題は、遠回しで、数学に対する基本的な無知からくるものです。
 
Irtron:
倍精度との数値比較の問題は、遠回しで、数学に対する基本的な無知からくるものです。

説明しよう。

明らかに観念が混同している。intelアーキテクチャで固定精度の数値を表現するために使用される浮動小数点数型があり、特に、プロセッサは浮動小数点演算のための特別なスレッシャーを持っているので、取引環境のすべての値を含んでいます。

実際、固定精度の数値は、機械表現上、整数とほとんど変わらない。この場合の小数点の有無は条件付きである。この特性は、PDAやスマートフォンなどで普及したARMなど、浮動小数点演算をハードウェアでサポートしないアーキテクチャで広く利用されている。浮動小数点演算は、かなり重いコードでエミュレートする必要があり、プロセッサを暖めるため、プログラムの実行 速度はもちろんのこと、バッテリーを浪費することになります。浮動小数点演算は極端な場合のみ使用されます。というか、当然そうあるべきでしょう。

市場価値に固定(=整数)演算を用いることを妨げるものはない。

指標の計算値には適用されません。そこでは、直接比較で十分なのです。なぜ、精密に比較するのか?
 
komposterさん、Irtron さん、ありがとうございました。すでにこれ以上何も書かれないと判断し、自分自身を発明するために座って、あなたの書き込みを見ませんでした。
私が狡猾な手口で書いたものをご覧ください
//+------------------------------------------------------------------------+
bool EqualDouble(double dN1, double dN2,int Digit)
{
double d1 =NormalizeDouble(dN1,Digit);
double d2 = NormalizeDouble(dN2,Digit);
bool res=false;
res=d1-d2 == 0.0;
return(res);
}.
//+------------------------------------------------------------------------+
bool LessDouble(double dN1, double dN2,int Digit) // If dN1<dN2
{
double d1 = NormalizeDouble(dN1,Digit);
double d2 = NormalizeDouble(dN2,Digit);
bool res=false;
res=d2-d1 > 0.0;
return(res);
} }.
//+------------------------------------------------------------------------+
bool MoreDouble(double dN1, double dN2,int Digit) // If dN1>dN2
{
double d1 = NormalizeDouble(dN2,Digit);
double d2 = NormalizeDouble(dN2,Digit);
bool res=false;
res=d1-d2 > 0.0;
return(res);
} }; bool res=false、res=dN1(dN2,Digit)
//+------------------------------------------------------------------+
Покритикуйте, пожалуйста.
 
VBAG:
だらだらとした手つきで走り書きしたものをご覧ください。
どのような値を比較しようとしているのでしょうか?価格、ロット、指標値?
 
Irtron:
VBAG です。
だらだらとした手つきで走り書きしたものを、ぜひ見てください。
どのような値を比較しようとしているのでしょうか?価格、ロット、指標値?
冒頭に書きました。"正しい "プログラミングスタイルに挑戦する。"
要するに、ダブリの中身に違いはなく、変数の要求に応じて、ディジットの丸めの精度が変わるだけなのです。
理由: