当前浮点(ANSI C浮点数,双精度)允许表示实数的近似值。
有没有办法表示实数而没有错误?
这是我的一个主意,绝非完美。
例如,1/3是0.33333333 ...(以10为底)或o.01010101 ...(以2为底),也是0.1(以3为底)
是实现这个“结构”的好主意:
base, mantissa, exponent
所以1/3可能是3 ^ -1
{[11] = base 3, [1.0] mantissa, [-1] exponent}
还有其他想法吗?
当前浮点(ANSI C浮点数,双精度)允许表示实数的近似值。
有没有办法表示实数而没有错误?
这是我的一个主意,绝非完美。
例如,1/3是0.33333333 ...(以10为底)或o.01010101 ...(以2为底),也是0.1(以3为底)
是实现这个“结构”的好主意:
base, mantissa, exponent
所以1/3可能是3 ^ -1
{[11] = base 3, [1.0] mantissa, [-1] exponent}
还有其他想法吗?
Answers:
这完全取决于您要做什么。
例如,您所显示的是表示有理数的一种好方法。但是它仍然不能完美地表示或e。
事实上,许多语言,比如Haskell和方案已经内置了对有理数的支持,将它们存储在形式,其中a,b是整数。
这些未得到广泛使用的主要原因是性能。浮点数有点不精确,但是它们的操作是在硬件中实现的。您提出的系统可以提高精度,但是需要执行几个步骤,而不是可以在硬件中执行的单个操作。
众所周知,某些实数是不可计算的,例如停止数。与不同,没有算法枚举其数字,只要等待足够长的时间,我们就可以计算第n个数字。
如果您想要非理性或超验数字的真实精度,则可能需要使用某种类型的符号代数系统,然后以符号形式获得最终答案,您可以近似于任意数量的数字。但是,由于上面概述的不确定性问题,此方法必然受到限制。对于近似积分或无穷级数之类的问题,它仍然很有用。
如果每个数字都具有有限的表示形式,则无法无误地表示所有实数。有无数个实数,但只有无数个1和0的有限字符串可用来表示它们。
你的想法行不通,因为一些在基地代表与尾数米和指数Ë是有理数b ⋅ 米- Ë,因此你的工作表现恰恰有理数而不是其他。你不能代表√例如 2。
可计算数学的整个分支涉及精确的实数运算。已经提出了许多表示精确实数的数据结构:数字流,仿射收缩流,有理柯西序列,二进位有理柯西序列,Dedekind割,缩水间隔序列等。存在基于精确实数的实现这些想法,例如:
在这些iRRAM中,最成熟,最有效的。马歇尔在一个实验性项目中,而第三个是学生项目,也是最容易访问的项目。它有一个很好的介绍,解释了有关实数计算的问题,我强烈建议您看一下。
我说一句话。有人会反对一个无限的对象不能用计算机来表示。从某种意义上说是正确的,但从另一个意义上讲则不是。我们永远都表示整个实数,我们只需要有限的逼近在计算的每个阶段。因此,我们只需要一个可以代表任何给定精度的实数的表示。当然,一旦我们用完了计算机内存,我们就会用完计算机内存-但这是计算机的限制,而不是表示本身。这种情况与编程中的许多其他情况没有什么不同。例如,人们在Python中使用整数,即使它们不能超过可用内存的大小,他们也会认为它们是“任意大”的。有时,无穷大是非常大的有限数的有用近似。
此外,我经常听到有人声称计算机只能处理可计算的实数。这错过了两个要点。首先,计算机可以访问来自外部世界的数据,因此我们还必须做出(不可验证的)假设,即外部世界也是可计算的。其次,我们需要区分计算机可以计算的实物和计算机可以代表的实物。例如,如果我们选择数字流作为实数的表示,则完全有可能表示一个不可计算的实数:如果有人将其提供给我们,我们将知道如何表示它。但是,如果我们选择将实数表示为计算数字的源代码片段,那么显然我们无法表示不可计算的实数。
无论如何,最好通过进一步阅读来解决该主题。
有许多有效的有理数实施,但是连续分数是提出了很多次,甚至可以很好地处理一些非理性的实现。
引用达伦·科林斯的续篇:
定理5-1。-当且仅当实数是有理数时,实数的连续分数表达式是有限的。
来自Mathworld的报价-定期续小数
...连续分数是周期的,前提是它是二次多项式的根。
即,所有根都可以表示为周期性连续分数。
注释中有许多“完全真实”的建议(例如,连续分数,线性分数变换等)。典型的陷阱是,尽管您可以计算公式的答案,但是等式通常是不确定的。
但是,如果您只对代数数感兴趣,那么您很幸运:实数封闭域的理论是完整的,o极小且可确定的。Tarski在1948年证明了这一点。
但是有一个陷阱。您不想使用Tarski的算法,因为它属于复杂性类NONELEMENTARY,这与不切实际的算法所能解决的一样不切实际。最近有更多方法可以将复杂度降低到DEXP,这是我们目前所知的最好方法。
请注意,此问题是NP难题,因为它包含SAT。但是,尚不知道(或认为是)NP。
编辑我将尝试进一步解释这一点。
理解所有这些的框架是一个决策问题,称为可满足性模理论,简称SMT。基本上,我们想为基于经典逻辑的理论求解SAT。
因此,我们从一阶经典逻辑与相等性测试开始。我们要包括哪些功能符号以及它们的公理决定了该理论是否可判定。
SMT框架中表达了许多有趣的理论。例如,存在用于帮助证明程序正确的数据结构理论(例如列表,二叉树等)以及欧几里得几何学。但出于我们的目的,我们正在研究不同种类的数论。
Presburger算术是自然数加法理论。这个理论是可以决定的。
Peano算术是具有加法和乘法的自然数论。正如哥德尔(Gödel)著名地证明的那样,这一理论是不可判定的。
Tarski算术是所有字段操作(加,减,乘和除)的实数理论。有趣的是,这种理论是可以决定的。当时,这是非常违反直觉的结果。您可能会认为,由于它是自然数的“超集”,因此“难”,但事实并非如此。例如,将有理数上的线性规划与整数上的线性规划进行比较。
满足感似乎并不是您所需要的,但事实就是如此。例如,如果要测试2的正平方根是否等于3的实立方根,则可以将其表示为可满足性问题:
阿尔弗雷德·塔斯基(Alfred Tarski,1948年),《基本代数和几何的一种判定方法》。
您不能代表计算机中的所有实数,但是可以代表许多。您可以使用分数表示比浮点数更多的数字。您还可以做一些更复杂的事情,例如将数字表示为多项式的根,并且近似值在牛顿法下将收敛到数字。