3

有人可以解释一下计算器(例如卡西欧袖珍计算器)如何管理诸如“500/12”之类的方程式并能够返回“125/3”作为结果,或者有人可以说出一些这样做的算法吗?

我所说的不精确数字是指不能用固定的小数位数表示的数字,例如 0.333 循环。

Windows 计算器能够证明这一点,如果执行“1/3”,您将得到“0.3333333333333333”作为答案,但如果将其乘以 3,您将返回“1”。

4

2 回答 2

1

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

于 2012-03-24T23:39:09.580 回答
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,一个未约化的分数。

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

精确分母方法的方法更容易。给定一个分母d和一个浮点数x,分子只是d * x四舍五入到最接近的整数。n/d然后通过计算最大公约数来减少分数。

可选地,原始浮点数可以替换为显示的分数。这称为对齐网格。这样,您可以输入 0.333 来创建一个完全等于的分数1/3。这使您无需四舍五入即可进行精确的小数运算。

希望这个答案可以为您解决所有问题:-) 如果有任何部分需要详细说明或进一步解释,请告诉我。

于 2012-03-24T22:01:40.803 回答