|
|
|
|
|
|
Вернуться
1 Алексеенко Андрей Витальевич, 11 апреля 2024 г. 18:07:07 | |
Большое спасибо
|
|
|
2 Меньшиков Фёдор Владимирович, 11 апреля 2024 г. 12:59:09 | |
Это касается любых вещественных чисел. Это связано с тем, что в компьютере вещественные числа представлены небольшим количеством байтов. Например, для long double достаточно 10 байтов, хотя gcc часто дополняет их до 16 байтов. Из эти 10 байтов (80 битов) один бит идёт на знак, 64 бита на мантиссу, 15 битов на экспоненту. Число, которое эта последовательность бит представляет, выражается так: (1 - s * 2) * (m / 2^63) * 2^(e-offset). То есть если бит знака s равен нулю, то в выражении умножение на 1, иначе на -1, биты мантиссы m (как 64-битное целое без знака) делятся на 2^63, и всё это умножается на 2 в некоторой степени, зависящей от целого числа, представленного 15 битами экспоненты. Из этого представления следует, что любые числа, которые не могут быть представлены в таком виде, нельзя абсолютно точно представить в типе long double. Например, 1.5 может быть представлено как 3/2 = 13 835 058 055 282 163 712 / 2^63. А 1.4 не может быть представлено как дробь со знаменателем степень двойки. Число 1.4 находится между 12 912 720 851 596 686 131 / 2^63 = 1,399999999999999999978... и 12 912 720 851 596 686 132 / 2^63 = 1,4000000000000000000867... и должно быть в компьютере представлено одним из этих чисел. То есть даже число 1.4 в компьютере не может быть представлено точно. Чем больше вычислений происходит с числом, тем больше эти неточности/погрешности/ошибки накапливаются - и по итогам вычисления результат получается только примерно какой надо. Причём в двух путях вычисления одного и того же погрешности могут накапливаться по-разному. Этим и объясняется наблюдаемый эффект, что сравнение с помощью == говорит, что числа различны, а сравнение модуля их разности с небольшим числом говорит, что числа очень близки. Ещё на эту тему можно посмотреть разбор задачи 37 "Сжимающий оператор" на моём канале "3.5 задачи в неделю".
|
|
|
3 Алексеенко Андрей Витальевич, 11 апреля 2024 г. 7:34:10 | |
Доброго времени суток. Хотелось бы узнать про сравнение long double-ов. Не первый раз встречаюсь с проблемой, когда простое сравнение не работает, зато, если сравнивать их разность с очень маленьким числом, например, 10^-7, всё работает(речь идёт о сдаче задачи). Если вам не сложно, могли бы вы объяснить.
|
|
|
Чтобы оставить сообщение необходимо зарегистрироваться и авторизоваться!
| | | |