voidOnStart()
{
//--- выведем DBL_MAX с помощью Print(), это равносильно PrintFormat(%%.16G,DBL_MAX)Print("---- как выглядит DBL_MAX -----");
Print("Print(DBL_MAX)=",DBL_MAX);
//--- теперь выведем число DBL_MAX с помощью PrintFormat()PrintFormat("PrintFormat(%%.16G,DBL_MAX)=%.16G",DBL_MAX);
//--- Вывод в журнал "Эксперты"// Print(DBL_MAX)=1.797693134862316e+308// PrintFormat(%.16G,DBL_MAX)=1.797693134862316E+308//--- посмотрим как выводится тип floatfloat c=(float)M_PI; // нужно явно приводить к целевому типуPrint("c=",c, " Pi=",M_PI, " (float)M_PI=",(float)M_PI);
// c=3.14159 Pi=3.141592653589793 (float)M_PI=3.14159//--- покажем, что может произойти при арифметических операциях над вещественными типамиdouble a=7,b=200;
Print("---- перед арифметическими операциями");
Print("a=",a," b=",b);
Print("Print(DoubleToString(b,16))=",DoubleToString(b,16));
//--- разделим a на b (7/200)
a=a/b;
//--- теперь как будто восстановим значение в переменной b
b=7.0/a; // ожидается, что b=7.0/(7.0/200.0)=>7.0/7.0*200.0=200 - но это не так//--- выведем вновь вычисленное значение bPrint("----- после арифметических операций");
Print("Print(b)=",b);
Print("Print(DoubleToString(b,16))=",DoubleToString(b,16));
//--- вывод в журнал "Эксперты"// Print(b)=200.0// Print(DoubleToString(b,16))=199.9999999999999716 (видим, что на самом деле b уже не равно 200.0) //--- создадим очень маленькое значение epsilon=1E-013double epsilon=1 e-13;
Print("---- создадим очень маленькое число");
Print("epsilon=",epsilon); // получим epsilon=1E-013//--- теперь вычтем эпсилон из числа b и выведем снова значение в журнал "Эксперты"
b=b-epsilon;
//--- выводим двумя способамиPrint("---- после вычитания epsilon из переменной b");
Print("Print(b)=",b);
Print("Print(DoubleToString(b,16))=",DoubleToString(b,16));
//--- вывод в журнал "Эксперты"// Print(b)=199.9999999999999 (теперь значение b после вычитания эпсилон не может округлиться до 200)// Print(DoubleToString(b,16))=199.9999999999998578// (теперь значение b после вычитания эпсилон не может округлиться до 200)
}
arithmetic formats: sets of binary and decimal floating-point data, which consist of finite numbers (including signed zeros and subnormal numbers), infinities, and special "not a number" values (NaNs) interchange formats: encodings (bit strings) that may be used to exchange floating-point data in an efficient and compact form rounding rules...
お客様のプロファイルに移動し、サービスデスクを選択します。
...印刷 機能に関するより完全な例を新たにヘルプに追加しました。
この問題を扱ったからには、余分な桁がどこから来るのか、赤でマークされていることを説明してください。
ただ以前、IEEE 754の場合、有効桁数は17を超えることはできず、小数点の後ではなく、すべて だと考えていました。
ただ、以前はIEEE 754の場合、有効桁数が17を超えてはいけないと思っていて、小数点 以下はダメで、トータルでは ダメだと思っていたんです。
正直なところ、気になったことはありません。しかし、ここにいくつかのリンクがありますので、興味のある方はご覧ください。
答えがあることを保証するものではありませんが、読んでみると面白いかもしれませんね。
正直、気になったことはありません。
DoubleToString関数に 何か問題があるのでしょう。
テスト(EURUSD,D1)666666.666666278616
不要な有効桁を生成する機能です。彼らはそこにいてはいけない。
DoubleToString関数に 何か問題があるのでしょう。
テスト(EURUSD,D1)666666.666666278616
不要な有効桁を生成する機能です。ないはずです。
DoubleToStringにたどり着きましたか?:)繰り返しますが、何も主張しているわけではありません。ハンドブックには、文字通り次のように書かれています。
"digits "の値が0から16の範囲にある場合、指定された小数点以下の桁数を持つ数値の文字列表現が取得されます。桁数が-1〜-16の場合は、小数点以下の桁数を指定した科学的な数値の文字列表現が得られます。それ以外の場合は、小数点以下8桁の数値列と なります」。
30の値を指定しました。リファレンスマニュアルの記述によると、この場合、数値の文字列値は小数点以下8 桁であるべきです。
DoubleToStringにたどり着きましたか?:)繰り返しになりますが、何も主張しているわけではありません。リファレンスマニュアルには、文字通り次のように書かれています。
30という値を持っていますね。リファレンスマニュアルの記述から判断すると、この場合の数値の文字列値は、小数点以下がすべて8 桁になるはずです。
参考書もこの場所にマイナス記号があります :)
ここからコピーしてきました: https://www.mql5.com/ru/docs/convert/doubletostring
私がハイライトしたフレーズ、「他のすべてのケースでは、数値の文字列値は小数点以下8桁になります」は、マイナス記号を含んでいないようです :/。
そして、文中の下線部の単語は冗長です。:)
私の質問は迷子になった。
https://www.mql5.com/ru/forum/1111/page721#comment_179003
令状はまだかかっている。