Папа
Высший разум
(149601)
1 неделю назад
Очевидно же. Вещественные числа с плавающей точкой хранятся в двоичном виде. Конечная десятичная дробь 5.4 является бесконечной периодической дробью в двоичной системе: 0.4 = 2/5, и 5 не делит основание системы счисления. Аналогично и с 8.9: 0.9 = 9/10.
Поэтому в последнем двоичном знаке мантиссы её придётся округлить. Отсюда и артефакты при печати в десятичном виде (0000000004, 9999999995 и т.п.).
А 0.5=1/2 имеет конечное представление и помещается в число с плавающей точкой без потерь, как и 0.25, 0.125, 0.0625 и т.д.
Чтобы не было потери точности, используется двоично-десятичный формат, хранящий все десятичные цифры (в пределах своей точности, конечно). Кстати, по исследованиям IBM 2003 года подавляющее большинство числовых данных в корпоративных БД хранится именно в нём.
Алекс Куха
Высший разум
(472201)
1 неделю назад
Только после того, как тс скажет, что он понимает под "максимальной точностью"
Как раз в Пайтоне легко оперировать с любой мантиссой, которая помещается в доступную память задачи
Ведь жили же без тебя
ФермаКактусовВысший разум (213534)
1 неделю назад
максимальная точность когда число 0.0000000000000000004 равно именно 0.0000000000000000004 а не 0.000000000000000000399 или 0.00000000000000000049234
ПапаВысший разум (149601)
1 неделю назад
Питоновский float точно так же ограничен и теряет знаки, как в других языках. Кишка у них тонка сделать бесконечный float.
1 литр энеоавлдввлталчлвлы
Гуру
(4335)
1 неделю назад
Проблема с плавающими числами и их максимальной точностью вызывает несколько факторов:
- Представление в двоичной системе: Плавающие числа обычно представляются в двоичной системе, что может привести к потере точности. Некоторые десятичные дроби не могут быть точно выражены в двоичной системе, что приводит к округлению.
- Ограниченная длина: Компьютеры имеют фиксированное количество бит для представления чисел с плавающей точкой (например, 32 бита для float и 64 бита для double). Это ограничение означает, что числа слишком великой или слишком малой величины могут быть представлены лишь приближенно.
- Кругление: Операции с числами с плавающей точкой могут приводить к круглению результатов. Например, при сложении или вычитании чисел с низкой и высокой точностью, высокая точность может быть утеряна.
- Ошибки накопления: При последовательном выполнении математических операций ошибки округления могут накапливаться, что приводит к более значительным отклонениям от ожидаемого результата.
В результате все эти факторы делают невозможным достижение "максимальной" точности чисел с плавающей запятой в большинстве языков программирования, включая Python.
Сергей Иванов
Оракул
(50380)
1 неделю назад
Если нужна точность большая, чем может уместить переменная определённого типа, можно хранить число в строке и парсить эту строку для выполнения любых операций с этим числом