Функция дроби, возвращающая невосстановленную дробь - PullRequest
0 голосов
/ 05 мая 2018

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

код

from fractions import Fraction

print(Fraction(1 + 1/(2 + 1/2)))

возвращает 3152519739159347/2251799813685248, который уменьшается до 7/5.

Я бы хотел, чтобы мой код возвращал уменьшенную дробь.

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Это связано с неточностью математики с плавающей запятой.

Хотя верно, что 1 + 1/(2 + 1/2) должно уменьшиться до 7/5 (или 1.4), десятичное число 1.4 не может быть точно представлено числами с плавающей запятой

>>> '{:030f}'.format(1.4)
1.39999999999999999999911182158029987

Эта неточность приводит к тому, что она производит дробь, отличную от 7/5

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

0 голосов
/ 05 мая 2018

Если вы хотите работать с дробями, вам нужно выполнять все операции в точной математике, а не просто конвертировать в Fraction в конце. Это означает, что не нужно делить int s на int s - это даст вам число с плавающей запятой.

from fractions import Fraction as F

1 + F(1, 2 + F(1, 2))
# or, taking advantage of how int/Fraction gives a Fraction,
1 + 1/(2 + F(1, 2))

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

...