袖珍计算器如何简化分数并将不精确的数字保持为分数?

时间:2012-03-24 21:17:46

标签: algorithm math fractions arbitrary-precision

有人可以解释计算器(例如卡西欧口袋)如何管理诸如'500/12'之类的方程并且能够返回'125/3'作为结果,或者可以有人为某些算法命名吗?

不精确的数字是指无法用固定的小数位数表示的数字,例如0.333重复出现。

Windows计算器能够证明这一点,如果你执行'1/3',你会得到'0.3333333333333333'作为答案,但是如果你把它乘以3你将会回到'1'。

2 个答案:

答案 0 :(得分:1)

我的HP分数显示让您为分数显示设置几种模式:

  • 设置最大分母。显示的分数最接近内部浮点值n/d,而 d 超过最大值。例如,如果最大值设置为10,则 pi 的浮点数最接近分数22/7。但是,如果最大值为1000,则最近的分数为355/113

  • 设置精确分母并减少结果。显示的分数是最接近内部浮点值的n/d,其中 d 等于精确分母。计算出 n 之后,该分数将被最大公分母减少。例如,如果分母固定为32,则浮点数0.51最接近16/32,后者将减少到1/2。同样,浮点数0.516最接近17/32,这是不可简化的。

  • 设置精确分母,不要减少结果。例如,0.51显示为16/32,未减少的部分。

最大分母方法的算法使用continued fractions。可以在http://hg.python.org/cpython/file/2.7/Lib/fractions.py#l206的limit_denominator方法中找到Python中易于理解的示例。

精确分母方法的方法更容易。给定分母 d 和浮点数 x ,分子只是d * x四舍五入到最接近的整数。然后通过计算greatest common divisor.

来减少分数n/d

可选地,原始浮点数可以由显示的分数代替。这被称为对齐网格。这样,您可以输入0.333以创建完全等于1/3的分数。这使您可以在不进行舍入的情况下进行精确的小数运算。

希望这个答案为你清除一切:-)如果有任何部分需要详细说明或进一步解释,请告诉我。

答案 1 :(得分:1)

我建议您查看GMP库的rational number functions。在某些时候,除非操作顺序特别简单,否则您需要在计算中接受有限精度。不合理(超越函数/常数)只能近似,例如,作为连续分数。