Floating point 用极限分母使数合理化
我知道Maxima CAS可以合理化浮点数(转换为比率): 是否有可能用极限分母之类的参数合理化浮点数 我想把极限分母设为10,结果是1/6Floating point 用极限分母使数合理化,floating-point,type-conversion,maxima,rational-number,Floating Point,Type Conversion,Maxima,Rational Number,我知道Maxima CAS可以合理化浮点数(转换为比率): 是否有可能用极限分母之类的参数合理化浮点数 我想把极限分母设为10,结果是1/6 (%i216) float(1/6); (%o216) 0.1666666666666666 这是对以下算法的翻译: (%i1)极限分母(x,最大分母):= 块([p0,q0,p1,q1,n,d,a,q2,k,bound1,bound2,ratprint:false], [p0,q0,p1,q1]:[0,1,1,0], [n,d]:ratexpan
(%i216) float(1/6);
(%o216) 0.1666666666666666
这是对以下算法的翻译:
(%i1)极限分母(x,最大分母):=
块([p0,q0,p1,q1,n,d,a,q2,k,bound1,bound2,ratprint:false],
[p0,q0,p1,q1]:[0,1,1,0],
[n,d]:ratexpand([ratnum(x),ratdenom(x)],0),
如果d max_分母,则抛出('done),
[p0,q0,p1,q1]:[p1,q1,p0+a*p1,q2],
[n,d]:[d,n-a*d]),
k:商(最大分母-q0,q1),
边界1:(p0+k*p1)/(q0+k*q1),
边界2:p1/q1,
如果abs(bound2-x)查看“Farley算法”,例如:
(%i216) float(1/6);
(%o216) 0.1666666666666666
(%i1) limit_denominator(x, max_denominator):=
block([p0, q0, p1, q1, n, d, a, q2, k, bound1, bound2, ratprint: false],
[p0, q0, p1, q1]: [0, 1, 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),
[p0, q0, p1, q1]: [p1, q1, p0+a*p1, q2],
[n, 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