29.07.13 19:09, MRAB написав(ла):
I'm surprised that Fraction(1/3) != Fraction(1, 3); after all, floats are approximate anyway, and the float value 1/3 is more likely to be Fraction(1, 3) than Fraction(6004799503160661, 18014398509481984).
>>> def approximate_fraction(f): prev_numer, numer = 0, 1 prev_denom, denom = 1, 0 r = f while True: i = math.floor(r) prev_numer, numer = numer, i * numer + prev_numer prev_denom, denom = denom, i * denom + prev_denom if i == r or numer / denom == f: break r = 1 / (r - i) return Fraction(numer, denom) >>> approximate_fraction(1/3) Fraction(1, 3) >>> approximate_fraction(1e-17) Fraction(1, 100000000000000000) >>> approximate_fraction(math.pi) Fraction(245850922, 78256779) I guess the Fraction constructor is more faster than this function. -- http://mail.python.org/mailman/listinfo/python-list