2017-02-22 14 views
1

我们无法以无限精度存储小数,但可能有某种表示方式,就像我们在haskell中表示无限列表一样。未来有没有解决浮点数精度问题的想法?

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

但有一些明显的问题,想想数a = 0.333...b = 0.666...,如果我们加在一起,我们得到了ans = 0.999...(数字序列),但我们绝不能不管a + b == 1在这种情况下告诉。

我想是,以某种方式定义十进制数,所以它支持+-*/>==操作,而且不管什么+-*,我们应用到这些/操作十进制数字,我们得到新的十进制数字,我们可以将它们精确计算为给定任意自然数k的k个数字。

我在想:是否有任何想法可以解决这个问题?

+1

你见过http://hackage.haskell.org/package/cyclotomic吗? – jkeuhlen

+3

我不确定你的要求是明确的。有可能'Rational'就是你想要的;它支持所有这些操作而不会失去精度(你将无法用它们构造一个不合理的数字) – jberryman

+2

更一般地说,你永远不能做“x == y”,因为无论你计算多少位数字都永远无法确定下一个不会有所不同。实际的解决方案似乎是有数字家族,以便程序员可以选择他们想要的。 –

回答

5

Haskell为进行精确算术而提供Rational,CyclotomicCReal

CReal,可计算实数,尽可能接近表示真实数字的机器;几乎任何你能想到并描述的实际数字都可以填入CReal。能够代表很多事情的权衡是你的观察力受到严重限制。检查是否平等,检查一个人是否比另一个人大,即使知道第一个数字应该是什么是技术上不可解释的问题;尽管Hackage提供的软件包提供了所有这些观察的近似算法。

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

Rational代表可以写成分数的所有数字。这是一个比CRealCyclotomic要小很多的实数:平方根(和其他根)几乎不在,三角函数几乎不在,pi和e在外等等。但是观察结果相对于CRealCyclotomic,所以他们有时只是票。

......当然,如果效率很重要的话,Double会用今天的硬件把所有这些冲出水面。仔细选择你的毒药!

+1

哪里(即哪个Hackage包)是这个'CReal'类型代表[可计算实数](https://en.wikipedia.org/wiki/Computable_number)?也许你的意思是['建设性'](https://hackage.haskell.org/package/numbers-3000.2.0.1/docs/Data-Number-CReal.html#t:CReal)? (很好的回答,我真的很好奇,如果有一个着名的Haskell实现可计算实数,我一直都不知道......) – user2407038

+0

@ user2407038据我所知,“建设性的实在”是“可计算实数”的同义词。 –

+0

我的理解是,'具有建设性的'实体具有“确切地知道第一个数字应该是[技术上不可判定的](如你在答案中所述)的性质,至少对于任意的具有建设性的实在,但'可计算的'实数具有该属性“我们可以将它们精确地计算为给定任意自然数k的k个数字。” (如OP所述)。构造性实数表示实际的实数集,而可计算实数只是实数的(密集)子集。这两个是不同的,但我不确定哪个数据CReal = CR(Int - > Integer)对应。 – user2407038

相关问题