用极限分母使数有理化

rationalize number with limit denominator

我知道 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, 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