Тип фракции Python не упрощается правильно

Тип Python Fraction, насколько я понимаю, выводит упрощенную версию того, что вы помещаете в него (т.е. print (Fraction (4/8)) выводит 1/2). Однако для определенных входов я получаю действительно странные результаты:

Дробь (984/1920) должна вывести 41/80, но вместо этого дает 2308094809027379/4503599627370496.

Дробь (1000/992) должна вывести 125/124, но вместо этого дает 4539918979204129/4503599627370496.

Дробь (408/896) должна вывести 51/112, но вместо этого дает 8202985035567689/18014398509481984.

Когда я ввожу правильно упрощенную дробь в тип Fraction, я получаю такое же ошибочное представление - даже такие же массивные значения. Есть еще много примеров их появления. Есть идеи относительно того, почему это так, и что я могу сделать, чтобы исправить это?


person Matt Billman    schedule 09.03.2017    source источник


Ответы (1)


Используйте запятую для разделения числителя и знаменателя:

>>> Fraction(984/1920)
Fraction(2308094809027379, 4503599627370496)
>>> Fraction(984, 1920)
Fraction(41, 80)

Использование / означает, что сначала выполняется деление двоичного числа с плавающей запятой, до передачи входных данных в Fraction. Таким образом, отображаемая дробь предназначена для двоичного числа с плавающей запятой после того, как оно было округлено до дроби с точностью 53 бита в числителе и степенью двойки в знаменателе:

>>> 984 / 1920
0.5125
>>> (0.5125).as_integer_ratio()
(2308094809027379, 4503599627370496)

Разделив аргументы на Дробь, вы передаете точные целые числа для числителя и знаменателя, которые затем можно уменьшить до наименьших членов, используя алгоритм наибольшего общего знаменателя.

person Raymond Hettinger    schedule 09.03.2017