Сообщить об ошибке.

Класс Context() модуля decimal в Python

Создать новый контекст среды для арифметических операций

Синтаксис:

import decimal

decimal.Context(prec=None, rounding=None, 
              Emin=None, Emax=None, capitals=None,
              clamp=None, flags=None, traps=None)

Параметры:

  • prec=None - точность арифметических операций,
  • rounding=None - режим округления,
  • Emin=None - показатель степени в диапазоне [MIN_EMIN, 0]
  • Emax=None - показатель степени в диапазоне [0, MAX_EMAX]
  • capitals=None - как выводить символ степени,
  • clamp=None - интервал десятичного числа в текущем контексте,
  • flags=None - список со статусами отслеживания сигналов,
  • traps=None - список с сигналами.

Возвращаемое значение:

  • новый контекст среды для арифметических операций.

Описание:

Класс Context() модуля decimal создает новый контекст. Если не указано ни одного аргумента, значения по умолчанию копируются из decimal.DefaultContext. Если аргумент flags не указан или отсутствует, все флаги очищаются.

Аргумент prec это целое число, которое задает точность арифметических операций в контексте. Данное число может принимать значения из интервала [0, MAX_PREC].

Аргумент rounding позволяет задать режим округления.

Аргументы traps и flags являются списками с сигналами и статусами их отслеживания.

Аргументы Emin и Emax являются целыми числами, задающими пределы для показателя степени. Значения Emin лежат в диапазоне [MIN_EMIN, 0], а значения Emax в диапазоне [0, MAX_EMAX].

Аргумент capitals определяет как выводить символ степени. По умолчанию это значение установлено в 1, что соответствует использованию заглавной буквы E, а 0 приводит к использованию строчной буквы e.

Поле clamp может быть равно либо 1 либо 0 по умолчанию. Если установлено в 1, экспонента - e десятичного числа в текущем контексте может находиться только в интервале [Emin - prec + 1, Emax - prec + 1].

Если clamp=0 то показатель степени просто не превосходит Emax. Когда `clamp=1 то его показатель степени будет уменьшаться а к коэффициенту добавляться соответствующее число нулей, таким образом это позволяет соответствовать ограничениям показателям степени, но приводит к потере информации о количестве значащих нулей справа:

>>> from decimal import *
>>> Context(prec=10, Emax=999, clamp=1).create_decimal('7.77e999')
# Decimal('7.770000000E+999')

Значение clamp=1 обеспечивает совместимость с числами с плавающей точкой фиксированной длинны, которые указаны в IEEE 754.

Класс Context() определяет несколько методов общего назначения, а также большое количество методов для выполнения арифметики непосредственно в данном контексте, которые здесь не рассматриваются.

Кроме того, для каждого метода класса Decimal(), за исключением методов Decimal.аdjust() и Decimal.аs_tuple(), существует соответствующий метод Context().

Например, для экземпляра контекста C и десятичного экземпляра x значение C.exp(x) эквивалентно x.exp(context=C). Каждый метод Context принимает целое число Python - экземпляр int везде, где принимается экземпляр decimal.Decimal().

Примеры использования:

>>> import decimal
>>> decimal.getcontext()
# Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, 
#         Emax=999999, capitals=1, clamp=0, flags=[Inexact, Rounded],
#         traps=[InvalidOperation, DivisionByZero, Overflow])
>>> C = decimal.Context(prec=5, rounding=decimal.ROUND_UP, clamp=1, Emax=999,
                        traps=[decimal.InvalidOperation, decimal.DivisionByZero])
>>> decimal.setcontext(C)
>>> C = decimal.getcontext()
>>> C
# Context(prec=5, rounding=ROUND_UP, Emin=-999999, 
#         Emax=999, capitals=1, clamp=1, flags=[], 
#         traps=[InvalidOperation, DivisionByZero])
>>> C.create_decimal('1.23e999')
# Decimal('1.23000E+999')

Методы общего назначения класса Context().

clear_flags():

Сбрасывает все сигнальные флаги на 0.

clear_traps():

Сбрасывает все ловушки на 0.

copy():

Вернуть дубликат контекста.

copy_decimal(num):

Возвращает копию десятичного Decimal() экземпляра num .

create_decimal(num):

Создает новый десятичный Decimal() экземпляр из num, но используя self в качестве контекста. В отличие от конструктора Decimal, точность преобразования, метод округления, флаги и ловушки применяются к преобразованию.

Это полезно, потому что константы часто задаются с большей точностью, чем требуется приложению. Еще одним преимуществом является то, что округление немедленно устраняет непреднамеренные эффекты из цифр, выходящих за пределы текущей точности. В следующем примере использование необоснованных входов означает, что добавление нуля к сумме может изменить результат:

>>> from decimal import Decimal, getcontext
>>> getcontext().prec = 3
>>> Decimal('3.4445') + Decimal('1.0023')
# Decimal('4.45')
>>> Decimal('3.4445') + Decimal(0) + Decimal('1.0023')
# Decimal('4.44')

Этот метод реализует операцию нумерации спецификации IBM. Если аргумент является строкой, никакие начальные или конечные пробелы или подчеркивания не допускаются.

create_decimal_from_float(f):

Создает новый десятичный Decimal() экземпляр из числа с плавающей точкой f, но округляя его, использует self в качестве контекста. В отличие от метода класса Decimal.from_float(), к преобразованию применяются точность контекста, метод округления, флаги и ловушки.

>>> from decimal import *
>>> context = Context(prec=5, rounding=ROUND_DOWN)
>>> context.create_decimal_from_float(math.pi)
# Decimal('3.1415')
>>> context = Context(prec=5, traps=[Inexact])
>>> context.create_decimal_from_float(math.pi)
# Traceback (most recent call last):
#     ...
# decimal.Inexact: None

Etiny():

Возвращает значение, равное Emin - prec + 1, которое является минимальным показателем степени для ненормальных результатов. При возникновении недостаточного значения показатель степени устанавливается на Etiny.

Etop():

Возвращает значение, равное Emax - prec + 1.

Обычный подход к работе с десятичными знаками заключается в создании экземпляров Decimal() и последующем применении арифметических операций, которые выполняются в текущем контексте для активного потока.

Альтернативный подход заключается в использовании методов контекста для расчета в конкретном контексте. Методы аналогичны тем, которые используются для класса Decimal(). Класс Context() определяет большое количество методов для выполнения арифметики непосредственно в данном контексте, которые здесь не рассматриваются

Кроме того, для каждого метода класса Decimal(), за исключением методов Decimal.аdjust() и Decimal.аs_tuple(), существует соответствующий метод Context().