mql5言語の特徴、微妙なニュアンスとテクニック - ページ 158

 

10e60程度の大きな値と、1e-40程度の小さな値の両方で埋め尽くされた行列があります。そして、このようなコードがあります。

      for(k=-16;k<=16;++k)
      {
        double Tmp1=(double)(DoubleToString(Matrix[i][j],k));
        double Tmp2=(double)((string)Matrix[i][j]);
        if(Tmp1==Tmp2)
          break;
      }
約27%のケースでk=15となる。それ以外の場合はk=-16。そこで質問ですが、(文字列)Matrix[i][j]の 演算をより厳密な変換関数に置き換える方法はありますか?それとも小数点以下をカットする機能があるのでしょうか?NormalizeDoubleが 正しくありません。1.12345678e-40を0に切り捨ててしまうので、小数点の後で切り捨てるようにしたいのです。あるいは、(文字列)への変換は独自の生命を持ち、関数で表現できないのか?ありがとうございます。
 
traveller00:

差分係数。

 
fxsaber:

差分係数。

もう少し具体的に教えてください。コード例付きとか?何々と何々の違い?

ポイントは、このようなダブル変換(double)((string)Matrix[i][j]); では、小数点以下が制御不能な文字数で切り捨てられることである。一方ではこの切り捨てを維持したい=繰り返せるようにしたい、他方ではこの文字数を制御したい。

 
traveller00:

もう少し具体的に教えてください。コード例付きとか?何々と何々の違い?

if (MathAbs(Value1 - Value2) < Epsilon)
 

あ、言いたいことはわかりました。いや、ちょっと質問が違う。ここでの比較は、(double)((string)Matrix[i][j]); による変換をDoubleToString による変換に置き換えることはできないことを示すための例として挙げたに過ぎない。実は、目の前の課題は、比較することではないのです。むしろ、このような二重変換によって、精度を一定にリセットしているのです。一方では(string) を介してクリッピングを繰り返し、他方ではDoubleToStringの ようにクリッピングの精度をコントロールできるようにしたいのです。

また、余談ですが、これらの変換は別々に行われ、別々の無関係な人生を歩んでいるということはないのでしょうか?

 
traveller00:

あ、言いたいことはわかりました。いや、ちょっと質問が違う。ここでの比較は、(double)((string)Matrix[i][j]); による変換をDoubleToString による変換に置き換えることはできないことを示すための例として挙げたに過ぎない。実は、目の前の課題は、比較することではないのです。むしろ、このような二重変換によって、精度を一定にリセットしているのです。一方では(string) を介してクリッピングを繰り返し、他方ではDoubleToStringの ようにクリッピングの精度をコントロールできるようにしたいのです。

また、余談ですが、これらの変換は別々に行われ、それぞれ無関係な生活を送っているのでしょうかね。

NormalizeDoubleとDoubleToStringで満足できない理由がわからない、欲しい精度があるのか、ある精度が欲しいがそれが何か わからないのか?

 

タスクが完全に透明化されていないことには同意します。テストのための松葉杖のようなものを組もうとしているからです。

1.0123456789e-50という数字があるとする。そうなるように、ある程度の精度で丸める必要があるんです。

1.デフォルトでは、(string) を介したダブルコンバージョンとして動作します。

2. 必要に応じて、精度をコントロールすることができます。

したがって、NormalizeDoubleは 適切ではなく、この数値は単にnullになります。また、DoubleToStringでは、ステップ1の結果を繰り返すことはできません。

問題は次の問題から大きくなる。上に書いたように、マトリックスがあります。この行列の逆行列を算出する。ダブルの精度の限界による誤差のためか、行列が縮退してしまい、逆行列が計算できないことがあります。しかし、少し精度を落としても、逆数を計算することはできます。そのため、いくつかのテストを行い、どの程度真に近い結果なのか統計を取りたいと思いました。(文字列) を介したダブルコンバージョンで、ほとんどの場合、問題は解決されます。でも、それだけでは足りないこともあるので、精度の高いカットをコントロールできるようにしたいですね。また、DoubleToStringは、精度が-16から16であっても、ほとんどの場合、問題を解決することはできません。

 

教えてください、pls.

インジケータでは、ArraySetAsSeries()で close[]などの系列の順番を一度設定するのか、それとも他の方法で設定するのでしょうか?

OnCalculate()またはOnInit()のどちらで行うのでしょうか?

戸惑う場面に遭遇したことがある。

最初のティックでAS_SERIESが設定したclose[]のオーダーが、次のティックで自然に通常のオーダー、つまり!AS_SERIESに変更される。

コード上では、このようなことをする理由は見つかっていません。

 
Yurixx:

教えてください、pls.

インジケータでは、ArraySetAsSeries()でclose[]などの系列の順番を一度設定するのか、それとも他の方法で設定するのでしょうか?

OnCalculate()の中で行うのか、OnInit()の中で行うのか?

戸惑う場面に遭遇したことがある。

最初のティックでAS_SERIESが設定したclose[]のオーダーが、次のティックで自然に通常のオーダー、つまり!AS_SERIESに変更される。

その理由は、コードの中に見つかりませんでした。

また、OnInit()ではclose[]配列は表示されません。また、他の定義済みOnCalculate()パラメータも ありません。

したがって、結論としては、OnCalculate()の中だけである。

 
Artyom Trishkin:

また、OnInit()では、close[]配列は表示されません。また、他の定義済みのOnCalculate()パラメータもありません。

したがって、結論としては、OnCalculate()の中だけである。

私も同じ結論に達しました。)))

この注文を一度設定すれば十分なのか、それとも毎回のティックで 設定する必要があるのかは、今後の課題です。

理由: