有什么想法在未来解决浮点数精度问题吗?

luo*_*990 1 theory precision haskell functional-programming codata

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

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

但有一些明显的问题,想想数a = 0.333...b = 0.666...,如果我们加在一起,我们得到了ans = 0.999...(数字序列),但我们永远无法知道是否a + b == 1在这种情况下.

我要的是,以某种方式定义十进制数,使之支持+,-,*,/,>,==运营,不管是什么+,-,*,/我们应用到这些十进制数字操作,我们得到新的十进制数,我们可以计算出它们给定任何自然数k精确到k位数.

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

Dan*_*ner 5

Haskell提供Rational,Cyclotomic并且CReal用于精确算术.

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

Cyclotomic可以代表一个小得多的实数,并且可以代表复数的一大块,同时保留精确的计算,并以可判定的方式支持更多的观察.你想要做的很多事情都可以通过分圆数来完成.

Rational表示可以写为分数的所有数字.这是一个非常小的实数大于CReal或者Cyclotomic:平方根(和其他根)几乎没有,三角函数几乎是出来的,pi和e都是出来的等等.但是观察结果相应地比CRealCyclotomic,和所以他们有时候只是门票.

......当然,如果效率很重要,那Double就是用今天的硬件将所有这些都吹走了.仔细选择你的毒药!