AlexanderD:
Попробуйте вот так:if ( (1.29-1.00)*100>29) Print("Bug!");
Непонятно, почему данное условие истинно и срабатывает Print.
Интересно, что нормализация первого выражения до любой точности дает корректную отработку условия.
Может быть, кто прокомментирует? Хотелось бы до конца разобраться.
if ( (1.29-1.00)*100>29.0) Print("Bug!");
Хм....Так то же не работает.
Действительно странно!
Действительно странно!
VBAG:
Хм....Так то же не работает.
Действительно странно!
Хм....Так то же не работает.
Действительно странно!
Просто наверно нельзя сравнивать действительное число с целочисленным. (double с int).
Vinin:
Просто наверно нельзя сравнивать действительное число с целочисленным. (double с int).
VBAG:
Хм....Так то же не работает.
Действительно странно!
Хм....Так то же не работает.
Действительно странно!
Просто наверно нельзя сравнивать действительное число с целочисленным. (double с int).
Но ведь должно сработать неявное приведение типов, причем у double приоритет выше
да видимо вот это выражение (1.29-1.00)*100 даёт погрешность в каком
то знаке после запятой может что то типа этого получается
29.000000000000034
Имеет смысл нормализовать перед сравнением до нужного знака после запятой в данном случае например NormalizeDouble((1.29-1.00)*100, 1);
29.000000000000034
Имеет смысл нормализовать перед сравнением до нужного знака после запятой в данном случае например NormalizeDouble((1.29-1.00)*100, 1);
Похоже на то, что операция вычитания вносит погрешность 0.000 000
000 000 01.
P.S. Просто ей больше неоткуда взяться .
P.S. Просто ей больше неоткуда взяться .
Эта специфика работы форматов double and float - их нельзя сравнивать просто так, всегда надо сравнивать с некой точностью
Я тока начал разбираться с этой всей системой.. и долго ломал голову что же за функция это NormalizeDouble. Подозреваю все пользуются одной и той же.. видел я ее пару раз в коде.. так вот - зачем она ? она явно избыточна почти везде.
Я тут немножко поизвращался с этим выражением... и получились
ещё более интересные наблюдения:
(0.27*100>27) -> возвращает false
(0.28*100>28) -> возвращает TRUE (!)
(0.29*100>29) -> возвращает false
Я здесь не писал числа с точкой (типа 27.00), т.к. проверил что это роли не играет в данных случаях. Похоже в MQL ещё полно багов :)
(0.27*100>27) -> возвращает false
(0.28*100>28) -> возвращает TRUE (!)
(0.29*100>29) -> возвращает false
Я здесь не писал числа с точкой (типа 27.00), т.к. проверил что это роли не играет в данных случаях. Похоже в MQL ещё полно багов :)
Это не баг MQL. Это детсад на форуме MQL. :))))
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
if ( (1.29-1.00)*100>29) Print("Bug!");
Непонятно, почему данное условие истинно и срабатывает Print.
Интересно, что нормализация первого выражения до любой точности дает корректную отработку условия.
Может быть, кто прокомментирует? Хотелось бы до конца разобраться.