%%HP:T(3); @ DEC2FRAC, by Joseph K. Horn \<< DUP2 @ Must be two arguments. Exit now if max denominator < 2, IF 1 > SWAP FP AND @ or if decimal fraction is an integer. THEN \-> f c @ Store decimal fraction, and max denominator. \<< 0 1 f @ Calculate only denominators. Do numerator only at end. WHILE OVER c < OVER AND @ Do until bigger than max denominator REPEAT INV DUP FP 4 ROLLD IP OVER * ROT + ROT @ This is the END DROP DUP2 c @ recursion formula continued fraction expansion. IF DUP2 > @ Is there a possible "missing" fraction? THEN - OVER / CEIL * - @ This is the new, fast "jump backwards". ELSE 3 DROPN @ (Sometimes there's no need to jump.) END DUP2 1 2 @ Take the new denominator & the previous one, and START DUP f * 0 RND SWAP / f - ABS SWAP @ turn into fractions. NEXT @ See which one's closest to the original decimal fraction. IF > @ Compare the two solutions, and THEN SWAP @ pick the better one. END DROP DUP f * 0 RND SWAP @ Calculate the numerator. \>> @ End of real work; now clean up the output. IF DUP ABS 1 > @ Is the denominator greater than 1? THEN -3 CF # 5603Eh SYSEVAL @ If so, make output into 'A/B' form. ELSE DROP @ Otherwise, get rid of extraneous denominator, END @ and exit program. ELSE DROP @ If bad arguments, do nothing to "decimal fraction", but END @ get rid of "maximum denominator" and exit program. \>>