fractions - Numeri razionali

Scopo Implementa una classe per lavorare coi numeri razionali
Versione Python 2.6 e superiore

La classe Fraction implementa le operazioni numeriche per i numeri razionali basate sull'API definita da Rational in numbers.

Creare istanze di frazioni

Come per decimal, i nuovi valori possono essere creati in diversi modi. Uno facile è quello di crearli da valori di numeratore e denominatore separati:

import fractions

for n, d in [ (1, 2), (2, 4), (3, 6) ]:
    f = fractions.Fraction(n, d)
    print '%s/%s = %s' % (n, d, f)

Il comune denominatore più basso viene mantenuto mentre vengono calcolati i nuovi valori.

$ python fractions_create_integers.py
1/2 = 1/2
2/4 = 1/2
3/6 = 1/2

Un altro modo per creare una frazione è usare una rappresentazione stringa di <numeratore> / <denominatore>

import fractions

for s in [ '1/2', '2/4', '3/6' ]:
    f = fractions.Fraction(s)
    print '%s = %s' % (s, f)
$ python fractions_create_strings.py
1/2 = 1/2
2/4 = 1/2
3/6 = 1/2

Le stringhe possono anche usare la più comune notazione decimale o a virgola mobile di [<cifre>].[<cifre>].

import fractions

for s in [ '0.5', '1.5', '2.0' ]:
    f = fractions.Fraction(s)
    print '%s = %s' % (s, f)
$ python fractions_create_strings_floats.py
0.5 = 1/2
1.5 = 3/2
2.0 = 2

Ci sono metodi di classe per creare istanze di Fraction direttamente da altre rappresentazioni di valori razionali tipo float o decimal.

import fractions

for v in [ 0.1, 0.5, 1.5, 2.0 ]:
    print '%s = %s' % (v, fractions.Fraction.from_float(v))

Notare che, per i valori a virgola mobile che non possono essere espressi esattamente, la rappresentazione razionale potrebbe contenere risultati inaspettati.

$ python fractions_from_float.py
0.1 = 3602879701896397/36028797018963968
0.5 = 1/2
1.5 = 3/2
2.0 = 2

L'uso di rappresentazioni decimali dei valori fornisce il risultato che ci si aspetta.

import decimal
import fractions

for v in [ decimal.Decimal('0.1'),
           decimal.Decimal('0.5'),
           decimal.Decimal('1.5'),
           decimal.Decimal('2.0'),
           ]:
    print '%s = %s' % (v, fractions.Fraction.from_decimal(v))
$ python fractions_from_decimal.py
0.1 = 1/10
0.5 = 1/2
1.5 = 3/2
2.0 = 2

Aritmetica

Una volta che le frazioni sono istanziate, possono essere usare in espressioni matematiche come ci si potrebbe aspettare.

import fractions

f1 = fractions.Fraction(1, 2)
f2 = fractions.Fraction(3, 4)

print '%s + %s = %s' % (f1, f2, f1 + f2)
print '%s - %s = %s' % (f1, f2, f1 - f2)
print '%s * %s = %s' % (f1, f2, f1 * f2)
print '%s / %s = %s' % (f1, f2, f1 / f2)
$ python fractions_arithmetic.py
1/2 + 3/4 = 5/4
1/2 - 3/4 = -1/4
1/2 * 3/4 = 3/8
1/2 / 3/4 = 2/3

Approssimazione dei valori

Una utile caratteristica di Fraction è la capacità di convertire un numero a virgola mobile in un valore razionale approssimato limitando la dimensione del denominatore.

import fractions
import math

print 'PI       =', math.pi

f_pi = fractions.Fraction(str(math.pi))
print 'Nessun limite =', f_pi

for i in range(1, 100, 5):
    limited = f_pi.limit_denominator(i)
    print '{0:8} = {1}'.format(i, limited)
$ python fractions_limit_denominator.py
PI       = 3.14159265359
Nessun limite = 314159265359/100000000000
       1 = 3
       6 = 19/6
      11 = 22/7
      16 = 22/7
      21 = 22/7
      26 = 22/7
      31 = 22/7
      36 = 22/7
      41 = 22/7
      46 = 22/7
      51 = 22/7
      56 = 22/7
      61 = 179/57
      66 = 201/64
      71 = 223/71
      76 = 223/71
      81 = 245/78
      86 = 267/85
      91 = 267/85
      96 = 289/92

Vedere anche:

fractions
La documentazione della libreria standard per questo modulo.
decimal
Il modulo decimal fornisce una API per matematica a virgola fissa e mobile.
numbers
Classi base astratte numeriche.