Recorte 9: Aritmética exata e números racionais#

Em Python, os módulos decimal e fractions oferecem alternativas para manipulação numérica por meio de aritmética exata e números racionais. Aqui temos aplicações simples de cada um.

decimal#

from decimal import *
  • Módulo decimal baseado no modelo de ponto flutuante, mas focado na aritmética computacional que equivale à feita por humanos.

  • Exemplo de operação que destoa da prática. Deveríamos ter objetivamente 2.2

0.3 + 1.9 
2.1999999999999997
  • A aritmética de ponto flutuante é sensível

0.1 + 0.1 + 0.1 - 0.3
5.551115123125783e-17
  • O módulo decimal trabalha com exatidão, dentro

getcontext().prec = 16
Decimal(0.3) + Decimal(1.9)
Decimal('2.200000000000000')
## ?
Decimal(0.1) + Decimal(0.1) + Decimal(0.1) - Decimal(0.3)
Decimal('1.110223024625157E-17')
getcontext().prec = 60
Decimal(1) / Decimal(7)
Decimal('0.142857142857142857142857142857142857142857142857142857142857')
getcontext()
Context(prec=60, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[Inexact, Rounded], traps=[InvalidOperation, DivisionByZero, Overflow])

fractions#

Módulo que fornece suporte à representação de números racionais (frações).

from fractions import Fraction
Fraction('0.1')
Fraction(1, 10)
Fraction(Decimal('0.1'))
Fraction(1, 10)
Fraction(32, 16), Fraction(16,32)
(Fraction(2, 1), Fraction(1, 2))
Fraction('8/7')
Fraction(8, 7)