Интересная ситуация со сравнением

 

if ( (1.29-1.00)*100>29) Print("Bug!");


Непонятно, почему данное условие истинно и срабатывает Print.

Интересно, что нормализация первого выражения до любой точности дает корректную отработку условия.

Может быть, кто прокомментирует? Хотелось бы до конца разобраться.

 
AlexanderD:

if ( (1.29-1.00)*100>29) Print("Bug!");


Непонятно, почему данное условие истинно и срабатывает Print.

Интересно, что нормализация первого выражения до любой точности дает корректную отработку условия.

Может быть, кто прокомментирует? Хотелось бы до конца разобраться.

Попробуйте вот так:
if ( (1.29-1.00)*100>29.0) Print("Bug!");
 
Хм....Так то же не работает.
Действительно странно!
 
VBAG:
Хм....Так то же не работает.
Действительно странно!

Просто наверно нельзя сравнивать действительное число с целочисленным. (double с int).
 
Вопрос к точности обработки:
Вот так условие срабатывает :
if ( (1.29-1.00)*100>29.000000000000001) Print("Bug!");

А вот так нет:
if ( (1.29-1.00)*100>29.00000000000001) Print("Bug!");
 
Vinin:
VBAG:
Хм....Так то же не работает.
Действительно странно!

Просто наверно нельзя сравнивать действительное число с целочисленным. (double с int).

Но ведь должно сработать неявное приведение типов, причем у double приоритет выше
 
да видимо вот это выражение (1.29-1.00)*100 даёт погрешность в каком то знаке после запятой может что то типа этого получается
29.000000000000034
Имеет смысл нормализовать перед сравнением до нужного знака после запятой в данном случае например NormalizeDouble((1.29-1.00)*100, 1);
 
Похоже на то, что операция вычитания вносит погрешность 0.000 000 000 000 01.

P.S. Просто ей больше неоткуда взяться .
[Deleted]  

Эта специфика работы форматов double and float - их нельзя сравнивать просто так, всегда надо сравнивать с некой точностью

Я тока начал разбираться с этой всей системой.. и долго ломал голову что же за функция это NormalizeDouble. Подозреваю все пользуются одной и той же.. видел я ее пару раз в коде.. так вот - зачем она ? она явно избыточна почти везде.

 
Я тут немножко поизвращался с этим выражением... и получились ещё более интересные наблюдения:
(0.27*100>27) -> возвращает false
(0.28*100>28) -> возвращает TRUE (!)
(0.29*100>29) -> возвращает false

Я здесь не писал числа с точкой (типа 27.00), т.к. проверил что это роли не играет в данных случаях. Похоже в MQL ещё полно багов :)
[Удален]  
Это не баг MQL. Это детсад на форуме MQL. :))))