On Jul 29, 2013 1:37 PM, "Serhiy Storchaka" <storch...@gmail.com> wrote: > > 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.
You might be able to speed it up a bit with numpy and the observation that the update is a matrix multiplication. But I don't think that you can get away from it being an iterative algorithm.
-- http://mail.python.org/mailman/listinfo/python-list