Нужна помощь с NormalizeDouble! - страница 3

 
Andrey Kisselyov:
берете калькулятор, пишите любое дробное число, жмете клавишу (1/Х) и если вы получаете не точное значение, то  у вас будет число с хвостом.

с уважением.

Ммм-да. Интересный момент.

Калькулятора не надо, ответ элементарен: 1/(3,6,7,9)

Оччень интересный момент....

 
Renat Akhtyamov:

Ммм-да. Интересный момент.

Калькулятора не надо, ответ элементарен: 1/(3,6,7,9)

Оччень интересный момент....

калькулятор нужен чтоб увидеть, что реально находиться в памяти компьютера и представляет ваше число.
с уважением.
 
Renat Akhtyamov:

Ммм-да. Интересный момент.

Калькулятора не надо, ответ элементарен: 1/(3,6,7,9)

Оччень интересный момент....

Это далеко не все, однако. Понятно, что 1/3 и 1/7 - бесконечные периодические дроби во всех системах счисления, у которых основание не кратно степени тройки (7). Также и в двоичной возникает беда с десятичными дробными числами, так как основание десятичной системы счисления (2 * 5) не кратно степени 2. Все хорошо, пока десятичное число является суммой нескольких степеней (1/2). Например, 0.28125 = 0.25 + 0.03125 = 0.5^2 + 0.5^5 записывается в двоичном виде как 2^(-5) * 0.01001  с конечным числом значащих цифр.

1/5 - бесконечная периодическая дробь в двоичном представлении. Из-за этого, в частности, десятичное число 0.1, представленное в IEEE 754 c двойной (double) точностью, равно 011111110111001100110011001100110011001100110011001100110010000. Чтобы убедиться, сделайте перевод в двоичную систему, например, с помощью вот этого онлайн калькулятора http://math.semestr.ru/inf/ieee754.php. В математике у повторений группы 1101 не было бы конца, но разрядность мантиссы ограничена.

Однако никто не смотрит, как записано число в двоичной форме, удобнее в десятичной. Преобразовывать число для такого просмотра приходится, по существу, два раза. И в десятичную систему счисления, и в строковое представление (ограниченное длиной приемной строки). На обоих этапах свои кочки, которые приводят к появлению "лишних" единиц или девяток или других цифр в конце строки-результата. Это общая причина возникающих неясностей при работе с числами с плавающей точкой. Всегда надо видеть в показываемом числе погрешность представления, которая может поменять желаемые цифры и вдалеке от конца строки, 5.9999999999999994 вместо 6, например.

Вторая неясность, с NormalizeDouble. Название функции противоречит стандартному пониманию (IEEE 754) нормализованных чисел. Эту особенность ввели MQ, зачем-то вместо обычного округления требующие при передаче некоторых параметров их предварительно "нормализовать". Надо использовать ее только там, где она явно требуется.

Формат представления чисел с плавающей запятой
  • math.semestr.ru
. Онлайн-калькулятор предназначен для представления вещественных чисел в формат с плавающей точкой. Представить число в: нормализованном экспоненциальном виде денормализованном экспоненциальном виде 32 битный формат IEEE 754 64 битный формат IEEE 754 Перевести обратно в десятичное представление . Представить число 133,54 в форме числа с...
 
Vladimir:
....

Вторая неясность, с NormalizeDouble. Название функции противоречит стандартному пониманию (IEEE 754) нормализованных чисел. Эту особенность ввели MQ, зачем-то вместо обычного округления требующие при передаче некоторых параметров их предварительно "нормализовать". Надо использовать ее только там, где она явно требуется.

я не вижу смысла вообще нормализовывать какие либо числа, по сути это сделать не возможно, так как сама машина вопреки нашему ЧЕЛОВЕЧЕСКОМУ смыслу приведет число не к целому какому то значению, а к приближенному. следовательно, как это принято работать с дробными, мы всегда, ДАЖЕ ПРИ НОРМАЛИЗОВАННОМ ВИДЕ ЧИСЛА, имеем дело не с ним, а с его приближением в какой то степени, что само по себе говорит нам что при сравнении необходимо иметь дело с погрешностями которые мы допускаем при расчетах и если эта погрешность превышена, должно работать наше условие. как в примере кода который я привел в первом своем посте в этой ветке.

с уважением.
 

Нормализовать числа, перед отправкой торгового приказа - это необходимость, иначе вас отфутболят с ошибкой 129

Париться по поводу хвостов - нет смысла, отучайте себя от сравнения double на равенство, вот так более корректно: fabs(d1-d2) <= Point

При выводе в принт, приводите к строке с заданной точностью

 
Andrey Kisselyov:

я не вижу смысла вообще нормализовывать какие либо числа, по сути это сделать не возможно, так как сама машина вопреки нашему ЧЕЛОВЕЧЕСКОМУ смыслу приведет число не к целому какому то значению, а к приближенному. следовательно, как это принято работать с дробными, мы всегда, ДАЖЕ ПРИ НОРМАЛИЗОВАННОМ ВИДЕ ЧИСЛА, имеем дело не с ним, а с его приближением в какой то степени, что само по себе говорит нам что при сравнении необходимо иметь дело с погрешностями которые мы допускаем при расчетах и если эта погрешность превышена, должно работать наше условие. как в примере кода который я привел в первом своем посте в этой ветке.

с уважением.

Функция NormalizeDouble() поможет отцу русской демократии. 

 
Aleksei Radchenko:

Нормализовать числа, перед отправкой торгового приказа - это необходимость, иначе вас отфутболят с ошибкой 129

Париться по поводу хвостов - нет смысла, отучайте себя от сравнения double на равенство, вот так более корректно: fabs(d1-d2) <= Point

При выводе в принт, приводите к строке с заданной точностью


Что значит отучаться? Так же можно отучаться есть и пить.

Если надо сравнивать, надо нормализовать до достаточной точности и сравнивать.

 
Aleksei Radchenko:

Нормализовать числа, перед отправкой торгового приказа - это необходимость, иначе вас отфутболят с ошибкой 129

Париться по поводу хвостов - нет смысла, отучайте себя от сравнения double на равенство, вот так более корректно: fabs(d1-d2) <= Point

При выводе в принт, приводите к строке с заданной точностью

я это говорю с самого начала https://www.mql5.com/ru/forum/205452#comment_5346762 , люди не понимают, что в машине нет десятичных чисел, и сравнивать формат double на равенство это все равно что монетку подкидывать, хоть ты ее нормализовал хоть не нормализовал погрешность будет всегда. что касается необходимости нормализации в торговых приказах, никто не утверждал что она не нужна, тут действуют правила работы с сервером и приказ, который вы отправляете на сервер, должен соответствовать определенным правилам, которые установлены производителем программного продукта и дилинговым центром, применяющий терминалы в торговле. я встречал дц у которых цена приходила с погрешностью меньше пипса, что приводило к ошибке при обработке ордера.

Нужна помощь с NormalizeDouble!
Нужна помощь с NormalizeDouble!
  • 2017.06.25
  • www.mql5.com
Скажите почему при volume=0.2*3 получается вот такое число 0,6000000000000001????????? Пробовал NormalizeDouble(volume,2)- та же песня, WTF...