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.6666666278616
这是生成不必要的有效数字的函数。他们不应该在那里。
DoubleToString函数 一定有问题。
测试(EURUSD,D1)666666.6666666278616
这是生成不必要的有效数字的函数。不应该有。
你有到DoubleToString吗?:)再说一遍,我不是在宣称什么:《参考手册》字面上说的是以下内容。
"如果数字值在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
逮捕令仍在悬挂。