1

我们不能以无限精度存储小数,但可能有某种方式来表示它们,就像我们在 haskell 中表示无限列表一样。

我想到的第一个想法是通过类似于Codata的东西来表示一个十进制数,这样对于任何给定的自然数 k,我们都可以计算出精确到 k 位的十进制数。

但是有一个明显的问题,想想数字a = 0.333...b = 0.666...,如果我们把它们加在一起,我们得到ans = 0.999...(a sequence of numbers) ,但我们永远无法判断是否a + b == 1在这种情况下。

我想要的是,以某种方式定义十进制数,使其支持+, -, *, /, >,==操作,无论我们对这些十进制数应用什么+, -, *,/操作,我们都会得到新的十进制数,我们可以计算它们给定任何自然数 k,精确到 k 位。

我想知道:有什么想法可以解决这个问题吗?

4

1 回答 1

6

Haskell 提供Rational,CyclotomicCReal用于进行精确算术运算。

CReal,可计算的实数,尽可能接近在机器上表示实数;几乎任何你能想到和描述的愚蠢的实数都可以塞进CReal. 能够代表这么多事物的权衡是您的观察能力受到严重限制。检查相等性,检查一个是否大于另一个,甚至确定第一个数字应该是什么,这些都是技术上无法确定的问题;尽管 Hackage 上提供的软件包为所有这些观察提供了近似算法。

Cyclotomic可以表示小得多的实数,并且可以表示相当大的复数,同时保持精确的计算,并以可确定的方式支持更多的观察。你想做的很多事情都可以用分圆数来完成。

Rational表示所有可以写成分数的数字。CReal这是一个比or小得多的实数Cyclotomic:平方根(和其他根)几乎没有,三角函数几乎没有,pi 和 e 没有,等等。但是观察结果相应地比 for CRealand更有效Cyclotomic,所以他们有时只是门票。

...当然,如果效率很重要,那么Double今天的硬件将把所有这些都从水中吹走。仔细选择你的毒药!

于 2017-02-22T20:32:21.173 回答