. . . в справку добавлен новый, более полный пример для функции Print:
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=1e-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)
}
Раз уж Вы разбирались с этим вопросом, то не могли бы пояснить, откуда берутся лишние цифры, они помечены красным цветом.
Просто я раньше думал, что для IEEE 754 количество значащих цифр не может превышать 17, причем не после запятой, а всего.
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...
Это она выдает лишние значащие цифры. Их не должно быть.
Добрались до DoubleToString? :) Опять-таки, ни на что не претендуя: в Справочнике сказано буквально следующее:
"Если значение digits лежит в диапазоне от 0 до 16, то будет получено строковое представление числа с указанным количество знаков после запятой. Если значение digits лежит в диапазоне от -1 до -16, то будет получено строковое представление числа в научном формате с указанным количеством знаков после запятой. Во всех остальных случаях число строковое значение числа будет содержать 8 знаков после запятой".
У Вас указано значение 30. Судя по описанию из Справочника, строковое значение числа в этом случае должно бы вообще содержать 8 знаков после запятой.
Выделенная мною фраза "Во всех остальных случаях число строковое значение числа будет содержать 8 знаков после запятой" как бы не содержит знак минус :/
. . . в справку добавлен новый, более полный пример для функции Print:
Раз уж Вы разбирались с этим вопросом, то не могли бы пояснить, откуда берутся лишние цифры, они помечены красным цветом.
Просто я раньше думал, что для IEEE 754 количество значащих цифр не может превышать 17, причем не после запятой, а всего.
Просто я раньше думал, что для IEEE 754 количество значащих цифр не может превышать 17, причем не после запятой, а всего.
Честно говоря, меня это никогда не волновало. Но вот могу дать пару ссылок, если интересно:
Не гарантирую, что там будут ответы на эти вопросы, но могут быть интересными для прочтения.
Честно говоря, меня это никогда не волновало.
Наверное, с функцией DoubleToString не все в порядке.
Test (EURUSD,D1) 666666.6666666666278616
Это она выдает лишние значащие цифры. Их не должно быть.
Наверное, с функцией DoubleToString не все в порядке.
Test (EURUSD,D1) 666666.6666666666278616
Это она выдает лишние значащие цифры. Их не должно быть.
Добрались до DoubleToString? :) Опять-таки, ни на что не претендуя: в Справочнике сказано буквально следующее:
"Если значение digits лежит в диапазоне от 0 до 16, то будет получено строковое представление числа с указанным количество знаков после запятой. Если значение digits лежит в диапазоне от -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
Ордер висит до сих пор.
Привет всем!
Столкнулся с таким багом (или может я чего недопонимаю)
При просмотре истории за месяц, отображаются адекватные данные, т.е. заработано 740, своп -250
В то же время когда смотрю за весь период, то заработано 500, своп почти такой же
Вот и не пойму как такое может быть когда заработано за весь период меньше чем заработано за месяц
Если надо, могу отчеты по истории приложить