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

 
SK. писал (а):
VBAG です。
あなたには期待してないわよ。

撤回します。
疑っていたのが間違いでよかった。
 

SKへ。

あなたが一番よく分かっているはずです。私はMQLをプログラミング言語とは考えていません。そんなDIALECTです。

ちなみに、私はその中の2つのことにうんざりしています。

1) 操作の列挙、すなわち中括弧がないこと

2) return - あなたは括弧にひどく疲れています。

全体として、みんなよくやった。

カーニガンとリッチー、二人に拍手。

 
VBAG писал (а):
前言撤回します。
疑っていたのが間違いでよかった。


言い争いにならなかった :)

デプフィー

私はMQLをプログラミング言語とは考えていません。そんなDIALECTです。

用語の問題でしょう。例えば、私はMQLに完全な言語としての属性をすべて見出しています。とにかく、トレーダーの活動を機械化・自動化できる数少ない言語(特に、最高の言語)です。 少なくとも、その可能性がほとんどのアルゴリズムのニーズを何倍も上回るという意味で、この言語は非常に満足できるものだと思います(言い換えれば、十分に考えられたアイデアがあり、その実現手段がすでに用意されていればですが)。
 
SK. писал (а):
...

このままでは、変数123.00000000000の初期値が、計算で使われる頃には122.9999999999になってしまうかもしれないのです。しかも、この変数が発見されて以来、その値は一度も変化しておらず、プログラムによって他の計算に参加するように要求されただけであるにもかかわらず、である。


実はこれが、今回の騒動の理由です。そのため、NormalizeDouble()はできるだけ実際の計算の近くで、できればif, for, while文の条件下で使用することにしています。

自分の言っていることに間違いはないのか?知識の出所を明記していただければ?

それなら、こんな質問もあります。

1.変数の記憶や読み出しに問題がある場合、戻り値もエラーで記憶や読み出しを行う場合、NormalizeDouble()はどうすればよいのでしょうか。
2.なぜNormalizeDouble(value, digits) というスキームなのか!OC!NormalizeDouble(value, digits) , ここで !OC!- 比較演算子、必ず動作するのでは? ifに直接入れても?
3?NormalizeDouble()の仕組み(関数アルゴリズム)をご存知ですか?
4.これについての私の意見を書きましたが、あなたはどう思いますか?

gravity001 さんが書き込みました(a)。


...
正規化については、すでにお話しました。まず、なぜ それを適用する必要があるのか、そして、どこで どのように 適用するのかを教えてください。

それが重要な問題なんですね。私自身、ずっと考えていたことなのですが、「2倍を 入力すれば2倍に なる」。 何が変わるのでしょうか。
正確な答えは見つかっていません。でも、こんな感じなのかなと想像しています。

double a = 2.000000000000
double b = 2.000000000001
double c = 1.9999999999

これらの変数はすべて異なり、最後の一桁まで正確にメモリに保存されています。
この場合、符号(数字)は私たち自身が定義します。定義されていないものはすべてゼロで埋め尽くされます。

double a = 2.0 と定義した場合、それが 2.0000001 または 1.999999 としてメモリに格納されているとしたら、NormalizeDouble() は不正確な値を返すため、役に立たないことは明らかです!
このようなエラーは、変数の値を記憶しているときにはほとんど発生しないと思います。それに、各文字(桁や点)はビット列の特定のビットと一緒に格納されているので、2.0という数字がわざわざ1.999999999と格納されているとは思えませんねしたがって、2.0という数値は、2.00000...00と安全に保存されます。

もうひとつは、自分たちで兆候を判断しない場合です。

a = 4.0;
b = 2.0;
c = a / b // - 「除算」演算はプロセッサ、というかコプロセッサが行い、プリメンテを文字(数字)で埋めていく。

操作後、それは可能です。
最も一般的です。
с = 2.000...0
с= 1.99999999...
с= 2.00000001...

つまり、真の値からわずかな差で結果が異なることが多いのです。

大きなエラーはほとんど発生しません。
с = 2.3

ここで、2つの説明があります。
1) aまたはbを呼び出す際に、ビット列の一部がメモリ上で影響を受けた、すなわち変数aおよびbが変更された。
2) "除算 "動作中にエラーが発生した。

2)が一番多く発生すると思います。なぜ、わからないのか。それは、コプロセッサが使い勝手が悪くなるほど高度に最適化されることを意図していることと関係があると思います。

変数と数値2.000...00を比較する場合、等式は明らかに失敗します。すべてのビットが同じになるわけではありません。

そこで、NormalizeDouble()がお役に立ちます!
NormalizeDouble() は、この小さなエラーを「修正」してくれます!
誤差は非常に小さいことが多いので、小さな精度で丸めれば必ず正しい結果が得られる。

こう考えてみてください。
a = 2.111...11 の数字を2桁目に丸めなさい。
NormalizeDouble() は 2.11 を新しい変数に書き込み、残りのビットを 1 ではなく 0 で埋めます!これは、2.11 を新しい変数に書き込み、残りのビットを 1 ではなく 0 で埋めます。
こんな感じになると思います。

double MyNormalizeDouble(double value, int digits)
{
     int factor = MathRound( MathPow(10, digits) ); // factor - это множитель,
                                                       с помощью которого мы из VALUE сделаем целое число
     double result = MathRound(factor * value) / factor;
     return(result);
}
ここでは、なぜNormalizeDouble()が必要なのか、その理由を一生懸命に説明しました。

最近までこの説明に納得していたが、最近になって、この方式が常に有効であるとは限らないことを確信した。

NormalizeDouble(a, 2) !NormalizeDouble(b, 2) ここで !OC!- は比較演算子です。
しかし、私の理解では、それは常に機能するはずです。
ですから、理路整然としたわかりやすい批判があれば、喜んでお受けしますよ
 
gravity001:
SK.は(a)を書いた。
...

このままでは、変数123.00000000000の初期値が、計算で使われる頃には122.9999999999になってしまうかもしれないのです。しかも、この変数が発見されて以来、その値は一度も変化しておらず、プログラムによって他の計算に参加するように要求されただけであるにもかかわらず、である。

実はこれが、今回の騒動の理由です。そのため、NormalizeDouble()を実際の計算のできるだけ近くで、できればif, for, while文の条件の中で直接使う必要があったのです。

自分の言っていることに間違いはないのか?その知識の源をお教えください。
間違いないです。知識の源は、ご自身のMQL4プログラミングの経験や開発者の方々の相談です。
1.変数の記憶や読み出しに問題がある場合、戻り値もエラーで記憶や読み出しを行うのであれば、NormalizeDouble()はどうすればよいのでしょうか。
NormalizeDouble() は、比較操作の直前に適用する必要があります。比較演算の結果はboolean型の値であり、決して「破損」することはない。
なぜ、NormalizeDouble(value, digits) !NormalizeDouble(value, digits) , ここで !OC! は比較演算子ですが、いつもうまくいかないのですか? if に直接入れても、?
そうとは言っていない。まさにその通りであり、そうすべきなのです。
3?NormalizeDouble()(関数アルゴリズム)の仕組みはご存知ですか?
いいえ、そんなことはありません。開発者に照会してください。
4.私の意見を書きましたが、いかがでしょうか?
あなたの意見は面白いのですが、この問題はとっくに解決しています。開発者が推奨するものを利用し、車輪の再発明をしない方がよいでしょう。
 
SK. писал (а):
gravity001:

2.なぜ NormalizeDouble(value, digits) というスキームが !OC!NormalizeDouble(value, digits) , ここで !OC! は比較演算子ですが、if? に直接挿入してもうまくいかないことがあります。
そうとは言っていない。まさにその通りであり、そうすべきなのです。

この件に関するその他のご意見はこちら

2つのダブルの比較についてもう一度」、一番最初の投稿から1ページ目です

整数 2006.12.24 15:23

残念ながら、NormalizeDouble(x-y,Digits) 構文と NormalizeDouble(x,Digits) - NormalizeDouble(y,Digits) 構文は同じものではありません。

レナート 2006年12月24日 16:15

そして、それは同一であってはならないのです。1つ目は正解です。

という構図になると思います。
if (NormalizeDouble(x,Digits) - NormalizeDouble(y,Digits) != 0)
と建設
if (NormalizeDouble(x,Digits) != NormalizeDouble(y,Digits))
は同じです!

いかがでしょうか?
 
gravity001:

レナート 2006年12月24日 16:15

そして、それは同一であってはならない。1つ目は正解です。

を構築していると思います。
if(NormalizeDouble(x,Digits) - NormalizeDouble(y,Digits) != 0)
と建設
if (NormalizeDouble(x,Digits) != NormalizeDouble(y,Digits))
は同じです!

いかがでしょうか?


レナートの意見も面白くない?MTを開発する会社の社長の意見には興味がないのですか?

それとも、プーシキンの童話に出てくる老婆のような存在なのでしょうか?ただ、欲しい、欲しい、欲しい! 物語の結末を忘れないでください。「魚は何も言わず、尻尾を振って青い海へ泳いで行った。彼は海辺で長い間、その答えを待っていた。彼は待たずに老婆に引き返した..."

 
SK. писал (а):
1つ目は、gravity001 です。


レナート 2006年12月24日 16:15

そして、それは同一であってはならない。1つ目は正解です。

を構築していると思います。
if(NormalizeDouble(x,Digits) - NormalizeDouble(y,Digits) != 0)
と建設
if (NormalizeDouble(x,Digits) != NormalizeDouble(y,Digits))
は同じです!

いかがでしょうか?



レナートの意見も面白くない?MTを開発する会社の社長の意見には興味がないのですか?


それとも、プーシキンの童話に出てくる老婆のような存在なのでしょうか?ただ、欲しい、欲しい、欲しい! 物語の結末を忘れないでください。「魚は何も言わず、尻尾を振って青い海へ泳いで行った。彼は長い間、海辺で返事を待っていた。彼は待たずに老婆に引き返した..."



つまり、レナートは第1の方法が正しく、第2の方法は正しくないと言い、あなたは第2の方法が正しいと言ったわけですね。

2.なぜ NormalizeDouble(value, digits) というスキームなのか !OC!NormalizeDouble(value, digits) , ここで !OC! は比較演算子ですが、if? に直接挿入してもうまくいかないことがあります。
そうとは言っていない。まさに、そういうことであり、そうあるべきなのです。
 

もろもろの比較という意味でそう言ったのです。

if (NormalizeDouble(x,Digits) > NormalizeDouble(y,Digits))

ということは、このタイプのコンストラクションは常に機能するとは限らないということです。

double a = NormalizeDouble(x,Digits);
double b = NormalizeDouble(y,Digits);
 
if (a > b)
  {
  ...
  }

つまり、NormalizeDouble()は演算子のヘッダに挿入され、比較演算が行われる場所にできるだけ近いところに配置されるべきです。

開発者の意見については、異議を唱えるつもりはない。

そして...そのスレッドでは全く別の構図が扱われていた。

 
SK. писал (а):

私はそう言って、もろもろの比較を暗に示しました。

if (NormalizeDouble(x,Digits) > NormalizeDouble(y,Digits))
多いか少ないかのチェックはしていませんが、平等かどうかのチェックはしています。
この構造を使うと、比較エラーが発生しました。

if (NormalizeDouble(x, digits) == NormalizeDouble(y, digits))
{
    ...
}
なぜ、わからないのですか?