decimal-десятичная арифметика с фиксированной и плавающей точками
Source code: Lib/decimal.py
Модуль decimal обеспечивает поддержку быстрой правильно округленной десятичной арифметики с плавающей запятой. Он имеет ряд преимуществ по сравнению с типом данных float:
- Decimal "основан на модели с плавающей запятой, которая была разработана с учетом интересов людей, и обязательно имеет первостепенный руководящий принцип – компьютеры должны обеспечивать арифметику, которая работает так же, как арифметика, которую люди изучают в школе”.
- Десятичные числа с фиксированной точкой могут быть представлены точно. При этом, такие числа, как 1.1 и 2.2, не имеют точного представления в двоичной системе с плавающей точкой. Конечные пользователи обычно не ожидают, что 1.1 + 2.2 будет отображаться как 3.3000000000000003, как это происходит с двоичными числами с плавающей точкой.
- Точность переносится в арифметику. В десятичной системе с плавающей точкой, 0.1 + 0.1 + 0.1 - 0.3 в точности равно нулю. В двоичной системе с плавающей точкой результат равен 5.5511151231257827 e-017. Хотя эти различия близки к нулю, они препятствуют надежному тестированию на равенство, и различия могут накапливаться. По этой причине десятичная дробь предпочтительна в бухгалтерских приложениях, которые имеют строгие инварианты равенства.
- Модуль decimal включает в себя понятие значимых мест, так что 1.30 + 1.20 равно 2.50. Замыкающий ноль сохраняется для указания значимости. Это обычное представление для денежных приложений. Для умножения “школьный” подход использует все цифры в мультипликандах. Например, 1.3 * 1.2 дает 1.56, а 1.30 * 1.20 - 1.5600.
- В отличие от аппаратной двоичной системы с плавающей точкой, десятичный модуль имеет изменяемую пользователем точность (по умолчанию 28 мест), которая может быть настолько большой, насколько это необходимо для данной задачи:
- Как двоичные, так и десятичные числа с плавающей запятой реализованы в терминах опубликованных стандартов. В то время как встроенный тип float предоставляет только скромную часть своих возможностей, модуль decimal предоставляет все необходимые части стандарта. При необходимости программист имеет полный контроль над округлением и обработкой сигналов. Это включает в себя возможность принудительного применения точной арифметики с помощью исключений для блокировки любых неточных операций.
- Модуль decimal был разработан для поддержки “без потери точности как точной неокругленной десятичной арифметики (иногда называемой арифметикой с фиксированной запятой), так и округленной арифметики с плавающей запятой”.-выдержка из спецификации десятичной арифметики.
Дизайн модуля сосредоточен вокруг трех концепций: десятичное число, контекст для арифметики и сигналы.
Десятичное число является неизменным. Оно имеет знак, цифры коэффициента и показатель степени. Чтобы сохранить значимость, цифры коэффициента не усекают конечные нули. Десятичные дроби также включают специальные значения, такие как бесконечность, минус бесконечность и NaN. Стандарт также отличает -0 от +0.
Контекст арифметики - это среда, определяющая точность, правила округления, ограничения на экспоненты, флаги, указывающие на результаты операций, и активаторы ловушек, которые определяют, следует ли рассматривать сигналы как исключения. Параметры округления включают ROUND_CEILING, ROUND_DOWN, ROUND_FLOOR, ROUND_HALF_DOWN, ROUND_HALF_EVEN, ROUND_HALF_UP, ROUND_UP и ROUND_05UP.
Сигналы - Это группы исключительных условий, возникающих в ходе вычислений. В зависимости от потребностей приложения сигналы могут игнорироваться, рассматриваться как информационные или рассматриваться как исключения. Сигналы модуля decimal: Clamped, InvalidOperation, DivisionByZero, Inexact, Rounded, Subnormal, Overflow, Underflow и FloatOperation.
Для каждого сигнала есть флаг и активатор ловушки. При обнаружении сигнала его флаг устанавливается равным единице, а затем, если активатор ловушки установлен равным единице, возникает исключение. Флаги являются липкими (sticky), поэтому пользователь должен сбросить их перед мониторингом расчета.
смотри также: IBM’s General Decimal Arithmetic Specification, The General Decimal Arithmetic Specification.