Существует ли чистая реализация Python fractions.Fraction
, которая поддерживает long
s в качестве числителя и знаменателя? К сожалению, возведение в степень, по-видимому, закодировано, чтобы вернуть число с плавающей точкой (ack !!!), которое должно по крайней мере поддерживать использование decimal.Decimal
.
Если нет, то, вероятно, я могу сделать копию библиотеки и попытаться заменить вхождения float()
на что-то подходящее из Decimal
, но я бы предпочел что-то, что было проверено другими ранее.
Вот пример кода:
base = Fraction.from_decimal(Decimal(1).exp())
a = Fraction(69885L, 53L)
x = Fraction(9L, 10L)
print base**(-a*x), type(base**(-a*x))
приводит к 0.0 <type 'float'>
, где ответ должен быть действительно небольшим десятичным знаком.
Обновление : на данный момент у меня есть следующий обходной прием (при условии, что для ** b оба являются дробями; конечно, мне понадобится другая функция, когда exp_ является плавающей точкой или является десятичным числом):
def fracpow(base, exp_):
base = Decimal(base.numerator)/Decimal(base.denominator)
exp_ = Decimal(exp_.numerator)/Decimal(exp_.denominator)
return base**exp_
, который дает ответ 4.08569925773896097019795484811E-516.
Мне все равно было бы интересно, есть ли лучший способ сделать это без дополнительных функций (полагаю, если я буду работать с классом Fraction
, я найду другие поплавки, которые будут влиять на мои результаты) .