Рубрики
Без рубрики

дроби – Рациональные числа

Автор оригинала: Doug Hellmann.

Цель:

Реализует класс для работы с рациональными числами.

Класс Fraction реализует числовые операции для рациональных чисел на основе API, определенного Rational в модуле numbers .

Создание экземпляров фракции

Как и в случае с десятичным модулем, новые значения можно создавать несколькими способами. Один простой способ – создать их из отдельных значений числителя и знаменателя:

fractions_create_integers.py

import fractions

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

Наименьший общий знаменатель сохраняется по мере вычисления новых значений.

$ python3 fractions_create_integers.py

1/2 = 1/2
2/4 = 1/2
3/6 = 1/2

Другой способ создать Fraction – использовать строковое представление / :

fractions_create_strings.py

import fractions

for s in ['1/2', '2/4', '3/6']:
    f  fractions.Fraction(s)
    print('{} = {}'.format(s, f))

Строка анализируется, чтобы найти значения числителя и знаменателя.

$ python3 fractions_create_strings.py

1/2 = 1/2
2/4 = 1/2
3/6 = 1/2

Строки также могут использовать более обычное десятичное представление или представление с плавающей запятой, состоящее из серий цифр, разделенных точкой. Поддерживается любая строка, которая может быть проанализирована с помощью float () и которая не представляет «не число» ( NaN ) или бесконечное значение.

fractions_create_strings_floats.py

import fractions

for s in ['0.5', '1.5', '2.0', '5e-1']:
    f  fractions.Fraction(s)
    print('{0:>4} = {1}'.format(s, f))

Значения числителя и знаменателя, представленные значением с плавающей запятой, вычисляются автоматически.

$ python3 fractions_create_strings_floats.py

 0.5 = 1/2
 1.5 = 3/2
 2.0 = 2
5e-1 = 1/2

Также можно создавать экземпляры Fraction непосредственно из других представлений рациональных значений, таких как float или Decimal .

fractions_from_float.py

import fractions

for v in [0.1, 0.5, 1.5, 2.0]:
    print('{} = {}'.format(v, fractions.Fraction(v)))

Значения с плавающей запятой, которые нельзя выразить точно, могут привести к неожиданным результатам.

$ python3 fractions_from_float.py

0.1 = 3602879701896397/36028797018963968
0.5 = 1/2
1.5 = 3/2
2.0 = 2

Использование Decimal представления значений дает ожидаемые результаты.

fractions_from_decimal.py

import decimal
import fractions

values  [
    decimal.Decimal('0.1'),
    decimal.Decimal('0.5'),
    decimal.Decimal('1.5'),
    decimal.Decimal('2.0'),
]

for v in values:
    print('{} = {}'.format(v, fractions.Fraction(v)))

Внутренняя реализация Decimal не страдает от ошибок точности стандартного представления с плавающей запятой.

$ python3 fractions_from_decimal.py

0.1 = 1/10
0.5 = 1/2
1.5 = 3/2
2.0 = 2

Арифметика

После того, как дроби созданы, их можно использовать в математических выражениях.

fractions_arithmetic.py

import fractions

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

print('{} + {} = {}'.format(f1, f2, f1 + f2))
print('{} - {} = {}'.format(f1, f2, f1 - f2))
print('{} * {} = {}'.format(f1, f2, f1 * f2))
print('{} / {} = {}'.format(f1, f2, f1 / f2))

Поддерживаются все стандартные операторы.

$ python3 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

Приблизительные значения

Полезной функцией Fraction является возможность преобразования числа с плавающей запятой в приблизительное рациональное значение.

fractions_limit_denominator.py

import fractions
import math

print('PI       =', math.pi)

f_pi  fractions.Fraction(str(math.pi))
print('No limit =', f_pi)

for i in [1, 6, 11, 60, 70, 90, 100]:
    limited  f_pi.limit_denominator(i)
    print('{0:8} = {1}'.format(i, limited))

Значение дроби можно контролировать, ограничивая размер знаменателя.

$ python3 fractions_limit_denominator.py

PI       = 3.141592653589793
No limit = 3141592653589793/1000000000000000
       1 = 3
       6 = 19/6
      11 = 22/7
      60 = 179/57
      70 = 201/64
      90 = 267/85
     100 = 311/99

Смотрите также