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

 
sergeev:
クラスを使用します。

はい、その通りです。気がつかなかった。記憶にもない、以前から提案されていたことだ。

その結果、こうなった。

struct Buff { double b[]; };
//---
Buff lbuff[];
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int i=2,j=1000;
//---
   ArrayResize(lbuff,i);
   ArrayResize(lbuff[0].b,j);
   ArrayResize(lbuff[1].b,j);
  }
ロッシュ
CMatrixクラスのオーバーロード操作の セクションを見てみてください。
ありがとうございます、勉強させていただきます。
 
Rosh:

実は、実数は 17桁以下の有効数字でメモリに保存されているのです。

この例で違いを感じてみてください。

ヘルプの記載を修正いたします。

そうです、Renatはすでに上で説明しましたが、Print()double型のデータをドット以降の小数点 以下 16 桁ではなく、4桁まで正確に出力 します。それが、ユーザーからすると、すべてのこだわりポイントだったのです。

 
Yedelkin:

はい、Renatはすでに上で、Print()double型のデータを小数点以下16 桁ではなく、4桁まで出力 することを説明しました。それが、ユーザーから見た問題点だったのです。

いいえ、Print()は%.16G フォーマットで印刷します。これは、ドットと有効数字16桁の数字を印刷しようとすることを意味します。この場合、格納される数値は199.9999999997となり、有効数字17桁(小数点以下3桁+小数点以下14桁)となる。16桁の数字を印刷しようとすると、丸めが始まり、7が10に丸められ、1つ上の桁に行き、9がそこにある。 ドミノの原理が始まり、印刷された数字は200に丸められる。

例を挙げてみてください。

void OnStart()
  {
   double a,b;

   a=7.0/200.0;
   b=7.0/a;
   Print("Print(b)=",b);
   Print("Print(DoubleToString(b,16))=",DoubleToString(b,16));
   double epsilon=MathPow(10,-13);
   Print("-------- После вычитания ",epsilon,"---------");
   b=b-epsilon;
   Print("Print(b)=",b);
   Print("Print(DoubleToString(b,16))=",DoubleToString(b,16));

   
  }

PrintFormat() を見てください。

 
Rosh:

いいえ、Print()は%.16G フォーマットで出力します。つまり、フルストップと有効数字16桁の数字を出力しようとします。この場合、格納される数値は199.9999999997となり、有効数字17桁(小数点以下3桁+小数点以下14桁)となる。16桁の数字を印刷しようとすると四捨五入が始まり、7が10に丸められ、1つ上の桁に行くと9がある。 ドミノの原理が始まり、印刷された数字は200に丸められます。

PrintFormat() を見てみましょう。

有効数字がいくつ格納されているかに注目する理由がわかりました。

...しかし、有効数字17桁以下の実数 (ここでは199.9999999997)を 格納する場合、有効数字はどこから来るのだろうか。

MP 0 victorg2 (EURUSD,M1) 11:04:42 Print(DoubleToString(b,16))=199.999999999999716

?(19件の排出をカウントしました)
 

"戦闘状態では、πの数は4にもなる "という。

DoubleToStringは、プリンタでの書式設定とは若干異なる動作をします(CRTにお任せします)。

DoubleToString は整数部と分数部を 別々に文字列に変換し、標準的なフォーマットよりも若干高速なアルゴリズムで変換します。

Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
  • www.mql5.com
Основы языка / Типы данных / Вещественные типы (double, float) - Документация по MQL5
 
stringo:

DoubleToStringでは、整数部と分数部が 別々に、標準のフォーマットよりも若干高速なアルゴリズムで文字列に変換されます。

しかし、その後、有効数字17桁より少し多い数字がメモリに保存 されていることが判明しました。そうでなければ、文字列に変換するための整数部や分数部はどこから来るのでしょうか?つまり、Print()にしろDoubleToString()にしろ、どこからかデータを取得している(具体的に「有効数字17桁以下でメモリに保存する」という話であれば)のだ。

...もちろん、「メモリに格納する」という言葉に釣られて、実数の格納という性質に無知なため、なかなかうまくいかないのかもしれません。

 
Yedelkin:

しかし、その後、メモリに格納されている 有効数字が17桁より少し多いことが判明したのです。そうでなければ、文字列に変換するための整数部や分数部はどこから来るのでしょうか。つまり、Print()にしろDoubleToString()にしろ、どこからかデータを取得しているのです(特に「有効数字17桁以下でメモリに保存する」という話であれば)。

...もちろん、「メモリに格納する」という言葉に釣られて、実数の格納という性質に無知なため、なかなかうまくいかないのかもしれませんが。

有効数字20桁まで格納できる場合もあるが、保証はしない。そして一般に、整数部の数字が大きくなるほど、分数 部の精度は低くなる。

なぜ小数点以下16桁が必要なのですか?学問的な興味?

Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
  • www.mql5.com
Основы языка / Типы данных / Вещественные типы (double, float) - Документация по MQL5
 
stringo:

有効数字20桁まで格納されることもありますが、保証されるものではありません。そして一般に、整数部の数字が大きくなるほど、分数 部の精度は低くなる。

なぜ小数点以下16桁が必要なのですか?学問的な興味?

:)そこで、駄々っ子電話ごっこをしないように、裏話を見てみましょう。

ここでは、Print()関数の動作と出力される値について質問 しています。

ここで私は、その理由を示した。

Print()関数の問題に煩わさ れたくなかったからである。

Print()関数の説明に double型のデータは、小数点以下16 桁の精度で出力されます」と書いてあるのを指摘するのが精一杯だったんだ。実は、Print() 関数は 具体例を 添付して、ある程度丸みを帯びたデータを出力する ことが判明したのです。

その後、激論が交わされ、結局、誰も私の例に反論できず、レナートは初版の概要を説明し、参考図書を 訂正すると言ってきた。

その数日後、ロシュは 17という数字が入った第二 版を提出した。

そこで、あなたは第三のバージョンを提案しました。"DoubleToString では、整数部と小数部が別々に文字列に変換され、標準のフォーマットよりも若干速いアルゴリズムで 変換されます" すなわち、すでにアルゴリズムの速度の問題であることが判明しているのです。

それから、一般的にロシュの第2版から保存された数値の大きさであることに注意を促しました。

ストリングス

なぜ小数点以下16桁が必要なのですか?学問的な興味?

これで、その質問に答えることができます。Print()関数が丸みを帯びたデータを出力する例を挙げましたが、そのような動作になる理由については聞いていません。私の例は反証されたわけではなく、別の機能を使うようにアドバイスされ、その理由を説明し始めただけなのです。その説明の中で、小数点以下が16桁(17桁)というのが出てきた。 その説明ですべてがわかったわけではないので、「ついでに」質問してみた。- だから、学問的な興味もなく、ただ、このアイデアが何を伝えようとしているのかを理解したいという思いがあった。

 
Yedelkin:

. . .だから、私のほうは学術的な興味もなく、ただ、どんなメッセージを伝えようとしたのか理解したいだけなんです。

大賛成です。学問的な興味は関係ない。

ドキュメントにある「実数」を読んでください。IEEE 規格754では 2倍 、有効数字が15桁の表が あります。これを考慮して、有効数字15桁、16桁、17桁、整数部と分数部を別々に格納するオプションの4種類を用意した。でも、そんなことはないんです!学問的な興味と何か関係があるのでしょうか?というより、初歩的な形式論理の話で、ちなみにこのプログラミング言語の基礎になっているのは、この形式論理です。

プログラマーはコンパイラを調査するのではなく、プログラムを書くべきだと思うのです。

追記

この場をお借りして、明確にしたいと思います。

ArrayResize()関数を使用して動的配列のサイズを大きくした場合、以前に配置したデータが保持されることは保証 されますか?この点については、ドキュメント(ArrayResize()関数の説明)に明示的に記載すべきかもしれません。ご存知の方がいらっしゃいましたら、アドバイスをお願い します。

 
victorg:

ArrayResize()で動的配列の サイズを大きくした場合、以前に配置したデータが保持されることは保証 されますか?この点については、ドキュメント(ArrayResize()関数の説明)に明示的に記載すべきかもしれません。ご存知の方がいらっしゃいましたら、アドバイスをお願い します。

サイズが大きくなればそうなるでしょうが、そうでなければこのような機能の意味がありません。