Gibt es eine reine Python-Implementierung von fractions.Fraction
, die long
s als Zähler und Nenner unterstützt? Leider scheint die Potenzierung so codiert zu sein, dass ein float (ack !!!) zurückgegeben wird, der zumindest decimal.Decimal
unterstützen sollte.Brüche mit dezimaler Genauigkeit
Wenn nicht, nehme ich an, ich kann wahrscheinlich eine Kopie der Bibliothek erstellen und versuchen, Vorkommen von float()
mit etwas passendem von Decimal
zu ersetzen, aber ich würde lieber etwas, das zuvor von anderen getestet wurde.
Hier ist ein Codebeispiel:
base = Fraction.from_decimal(Decimal(1).exp())
a = Fraction(69885L, 53L)
x = Fraction(9L, 10L)
print base**(-a*x), type(base**(-a*x))
Ergebnisse in 0.0 <type 'float'>
wo die Antwort ein wirklich kleines dezimal sein sollte.
Update: Ich habe die folgende Umgehung für jetzt (vorausgesetzt, für a ** b, dass beide Brüche sind; natürlich brauche ich eine andere Funktion, wenn exp_ ein float ist oder selbst ist ein Dezimal):
def fracpow(base, exp_):
base = Decimal(base.numerator)/Decimal(base.denominator)
exp_ = Decimal(exp_.numerator)/Decimal(exp_.denominator)
return base**exp_
, die die Antwort 4.08569925773896097019795484811E-516 gibt.
Ich wäre immer noch interessiert, wenn es eine bessere Möglichkeit gibt, dies ohne die zusätzlichen Funktionen zu tun (ich denke, wenn ich mit der Fraction
Klasse genug arbeite, werde ich andere Schwimmer finden, die ihren Weg in meine Ergebnisse arbeiten).
Wenn ich Fraktionen mache.Fraktion (11,17) ** 2 bekomme ich Brüche.Fraktion (121, 289). Was bekommst du? –
Versuchstyp (Brüche. Fraktion (11,17) ** 2.1) – Noah
IMO, das Verhalten, das Sie sehen, ist richtig, obwohl nicht was Sie wollen.Da der Exponent ein float ist, ist es sinnvoll, dass Dinge in float umgewandelt werden. Nun, wenn der Exponent Fraction (21,10) wäre, wäre das interessanter ... –