Floating point 用极限分母使数合理化

Floating 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

我知道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]: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