问题描述
我知道Maxima CAS可以合理化浮点数(转换为比率):
(%i215) rat(0.1667);
(%o215) 1667/10000
是否可以使用in python 之类的极限分母来合理化浮点数?
我想将极限分母设置为10,结果为1/6。
(%i216) float(1/6);
(%o216) 0.1666666666666666
解决方法
这是python中算法的翻译:
(%i1) limit_denominator(x,max_denominator):=
block([p0,q0,p1,q1,n,d,a,q2,k,bound1,bound2,ratprint: false],[p0,q1]: [0,1,0],[n,d]: ratexpand([ratnum(x),ratdenom(x)],0),if d <= max_denominator then x else
(catch(
do block(
a: quotient(n,d),q2: q0+a*q1,if q2 > max_denominator then throw('done),q1]: [p1,p0+a*p1,q2],d]: [d,n-a*d])),k: quotient(max_denominator-q0,q1),bound1: (p0+k*p1)/(q0+k*q1),bound2: p1/q1,if abs(bound2 - x) <= abs(bound1 - x) then bound2 else bound1))$
(%i2) x: 3.141592653589793 $
(%i3) limit_denominator(x,10);
22
(%o3) --
7
(%i4) limit_denominator(x,100);
311
(%o4) ---
99
(%i5) limit_denominator(4321/8765,10000);
4321
(%o5) ----
8765