¿Hay una implementación python pura de fractions.Fraction
que admita long
s como numerador y denominador? Desafortunadamente, la exponenciación parece estar codificada para devolver un float (¡ack!), Que al menos debería ser compatible con decimal.Decimal
.Fracciones con precisión decimal
Si no lo hay, supongo que probablemente pueda hacer una copia de la biblioteca e intentar reemplazar las ocurrencias de float()
con algo apropiado de Decimal
, pero preferiría algo que otros hayan probado anteriormente.
Aquí está un ejemplo de código:
base = Fraction.from_decimal(Decimal(1).exp())
a = Fraction(69885L, 53L)
x = Fraction(9L, 10L)
print base**(-a*x), type(base**(-a*x))
resultados en 0.0 <type 'float'>
donde la respuesta debe ser una muy pequeña decimal.
Actualización: Tengo la siguiente solución alternativa por ahora (asumiendo, para a ** b, que ambas son fracciones, por supuesto, necesitaré otra función cuando exp_ sea una carroza o sea ella misma un decimal):
def fracpow(base, exp_):
base = Decimal(base.numerator)/Decimal(base.denominator)
exp_ = Decimal(exp_.numerator)/Decimal(exp_.denominator)
return base**exp_
que da la respuesta 4.08569925773896097019795484811E-516.
Todavía estaría interesado si hay una mejor manera de hacer esto sin las funciones adicionales (supongo que si trabajo con la clase Fraction
lo suficiente, encontraré otras carrozas trabajando en mis resultados).
Cuando hago fracciones.Fraccion (11,17) ** 2 Recibo fracciones.Fraccion (121, 289). ¿Qué obtienes? –
try type (fractions.Fraction (11,17) ** 2.1) – Noah
IMO, el comportamiento que ves es el correcto, aunque no el que quieres.Como el exponente es un flotante, es razonable que las cosas se conviertan en flotación. Ahora, si el exponente fuera Fracción (21,10), sería más interesante ... –