在Clojure中使用惰性序列的十进制扩展

时间:2013-11-28 01:08:49

标签: math clojure floating-point

是否有一个包使用惰性序列表示Clojure中的十进制扩展?

例如,语法如

(defn r `(B N x_1 x_2 x_3 ...))

可以代表基数r中的实数B,带有十进制扩展(以数学符号表示)

r = N . x_1 x_2 x_3 ...

具有整数有效数N和十进制数0 ≤ x_i ≤ B-1

如果类型足够“智能”,它可以处理实数的不同十进制扩展作为有效输入,例如(10 0 9 9 9 ...)(10 1),并且在后一种形式中始终输出小数扩展。它还应该能够处理溢出的数字,例如将(10 0 15)缩减为(10 1 5)

使用实数的惰性序列表示而不是通常的十进制扩展是否有任何阻碍?我不知道它与浮点相比有多高效,但是对于涉及实数的严格精确算法会很方便。例如,我认为存在递归计算π和e的小数展开的算法。

1 个答案:

答案 0 :(得分:3)

TL; DR

简短的回答是,不,没有这样的图书馆,我怀疑会有一个。有可能计算精度大于IEEE双精度的数字,但是通过表示作为单个数字序列这样做在存储器方面是非常浪费的并且在一般情况下不可能完全懒惰地进行。例如,按术语懒惰地计算(+ '(0 9 0 ... ) '(0 9 1 ...))

长版

当将实数或表达式的值“计算”(近似)到机器精度时,计算的运算是所需表达式到{N}的taylor series扩展,直到N + 1的值为止。 term小于机器精度,此时近似值被中止,因为硬件约定不能代表更多信息。

通常,您只会看到32位和64位IEEE浮点标准,但IEEE浮点规范扩展到高达128位的表示。

为了论证,我们假设有人扩展clojure.core.math以获得一些代表arbitrary-precision-number,这是一个针对支持ByteArray的软件浮点实现,它通过一个协议出现给所有人意图和目的是正常java.lang.Number。这种表示实现的所有目的是将机器epsilon(代表性错误限制)推出甚至低于IEEE DOUBLE / 64提供的5x10e-16界限。构建这样的软件浮点系统是完全可行的并且相对较好地进行了探索。但是我不知道它的Java / Clojure实现。

真正的任意精度是不可能的,因为我们需要构建有限的内存机器,因此在某些时候我们必须在性能,内存和精度上妥协。给定一些库可以正确且通常代表任意泰勒级数评估作为某一点的十进制数字序列,我声称由于需要执行,对这些任意数字的绝大部分操作将被截断为某个精度P.与固定精度表示(如float或double)进行比较,因为它们是浮点表示的行业标准。

为了使这个井真实地脱离水面,在1光年的距离下,1e-100度的角度偏差将导致大约1.65117369558e-86 meteres的导航误差。这意味着即使对于星际导航,具有IEEE DOUBLE / 64的5x10e-16的现有机器epsilon也是完全可以接受的。

正如你所提到的,将Pi或其他有趣系列的十进制项计算为一个懒惰序列,这里只能实现进展,因为目标是对一系列/序列的表示和研究,而不是加法,减法,乘法和软化在两个或更多这样的表示之间。