我知道 Maxima CAS 可以使浮点数合理化(转换为比率):
(%i215) rat(0.1667);
(%o215) 1667/10000
是否可以像在 python 中一样使用极限分母来合理化浮点数?
我想将限制分母设置为 10,结果为 1/6。
(%i216) float(1/6);
(%o216) 0.1666666666666666
我知道 Maxima CAS 可以使浮点数合理化(转换为比率):
(%i215) rat(0.1667);
(%o215) 1667/10000
是否可以像在 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