7kozlov
Июль 4, 2022 12:36:38
Приветствую.
Вопрос общего плана.
абсолютный чайник, прошел 3 урока.
Решал разные задачки, столкнулся с тем, что питон не всегда считает до нормальных целых знаков.
Вот должно получаться ровно 2.5 а у него получается 2.499999999999637 какие-нибудь.
Почему так? откуда он это берет? и как этого избегать без особо сложных конструкций?
Потому что иногда эти “блохи” не только чреваты ошибками в принципе, но и считаются ошибкой в некоторых задачах.
Можно, казалось бы заранее указывать кол-во знаков, но не всегда можно заранее угадать, с какого знака он начнет лепить эти 9999
Спасибо.
ЗЫ Не думаю, что необходимы примеры - не верю, что никто не сталкивался. Но если надо, пришлю, когда снова столкнусь.
Areostar
Июль 4, 2022 16:22:24
round(14.22222223, 2)
>> 14.22
7kozlov
Июль 4, 2022 18:01:00
Areostar
round(14.22222223, 2)
спасибо. Но не всегда заранее понятно, что именно после второго знака начнется ерунда.
Хотелось бы универсальный способ. Хотя бы для результатов, которые вполне и АБСОЛЮТНО точно выражаются конечным числом в десятичной системе с вменяемо небольшим кол-вом знаков после запятой. Не обязательно 2,5 пусть 3,75 или 1,125
FishHook
Июль 4, 2022 18:13:33
7kozlov
Хотелось бы универсальный способ.
7kozlov
абсолютный чайник, прошел 3 урока.
продолжайте свои уроки, вам расскажут про типы
doza_and
Июль 4, 2022 19:37:53
7kozlov
Почему так? откуда он это берет?
Он это берет у процессора, который именно так и считает. Плавающая арифметика приближенная.
такой результат будет в любом языке программирования при использовании чисел в стандарте IEEE 754
https://en.wikipedia.org/wiki/Double-precision_floating-point_format#:~:text=In%20the%20IEEE%20754%2D2008,recently%2C%20base%2D10%20representations.7kozlov
но и считаются ошибкой в некоторых задачах.
Авторы таких задач безграмотны, на них не надо обращать внимание.
7kozlov
и как этого избегать
Никак. При выводе вы можете округлить числа (например форматы f, g, e ). Но внутри расчет ведется именно с такими числами.
7kozlov
Июль 5, 2022 15:56:33
Большое спасибо за ответы. Кое-что понял.
Для меня, как чайника, стало открытием, что процессоры оперируют такими “кривыми” числами даже в тех случаях, когда есть “прямые” - то есть ровные и почти “целые”. Это значит заранее допускать дополнительные погрешности (и их возможное накопление) даже тогда, когда можно (казалось бы чайнику) обойтись без них. Вот очень мне это странно и математически противоестественно даже ))
Еще раз спасибо.