Вопрос в том почему не работает первый вариант из первого поста:
1 вариант.
int start()
{
int delta;
delta=(1.0548-1.0541)/Point;
Comment(delta);
return(0);
}
Результат:delta = 6.
А должно быть 7
Потому, что число 0.0007 не может быть точно представлено двоичным кодом. Получается 0.000699999999999. При приведении типов от дабл к инт дробная часть просто отбрасывается. Потому и получается 6.
При нормализации разности Вы получите что-то типа 0.0007000000000001. Дальше аналогично.
При округлении обычно работает правило +0.5 и отбрасывание дробной части - потому тоже получается 7.
Здесь нет мусора -> (1.0548-1.0541). Мусор появляется после деления.
Когда происходит деление на число меньше единицы, то это аналогично умножению. Т.е. значимая часть числа сдвигается влево и тянет за собой мусор в новых разрядах справа.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Вот так всегда 7:
Вот так всегда 7:
Вопрос в том почему не работает первый вариант из первого поста:
1 вариант.
int start()
{
int delta;
delta=(1.0548-1.0541)/Point;
Comment(delta);
return(0);
}
Результат:delta = 6.
А должно быть 7
меня волнует внутренний принцип по которому
происходят вычисления в 1 варианте и получается 6, а не 7.
Кроме того по правилам приведения типов у меня должно быть 7.Вопрос в том почему не работает первый вариант из первого поста:
1 вариант.
int start()
{
int delta;
delta=(1.0548-1.0541)/Point;
Comment(delta);
return(0);
}
Результат:delta = 6.
А должно быть 7
Потому, что число 0.0007 не может быть точно представлено двоичным кодом. Получается 0.000699999999999. При приведении типов от дабл к инт дробная часть просто отбрасывается. Потому и получается 6.
При нормализации разности Вы получите что-то типа 0.0007000000000001. Дальше аналогично.
При округлении обычно работает правило +0.5 и отбрасывание дробной части - потому тоже получается 7.
Вопрос в том почему не работает первый вариант из первого поста:
1 вариант.
int start()
{
int delta;
delta=(1.0548-1.0541)/Point;
Comment(delta);
return(0);
}
Результат:delta = 6.
А должно быть 7
Особенности хранения и вычисления действительных чисел в компьютере. Это мат. процессор, а не MQL
Кажется, понял почему так.
Здесь нет мусора -> (1.0548-1.0541). Мусор появляется после деления.
Когда происходит деление на число меньше единицы, то это аналогично умножению. Т.е. значимая часть числа сдвигается влево и тянет за собой мусор в новых разрядах справа.
Кажется, понял почему так.
Здесь нет мусора -> (1.0548-1.0541). Мусор появляется после деления.
Когда происходит деление на число меньше единицы, то это аналогично умножению. Т.е. значимая часть числа сдвигается влево и тянет за собой мусор.
посмотрите в студии эта разница не равна 0.0007.
посмотрите в студии эта разница не равна 0.0007.
И правда!
Константа чистая. Результат не очень.
Если сделать так
то получим