用极限分母使数字合理化

问题描述

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...