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

Tom*_*tta 5 math floating-point clojure

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

例如,语法就像

(defn r `(B N x_1 x_2 x_3 ...))
Run Code Online (Sandbox Code Playgroud)

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

r = N . x_1 x_2 x_3 ...
Run Code Online (Sandbox Code Playgroud)

带有整数有效数N和十进制数0 ? x_i ? B-1.

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

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

arr*_*dem 3

长话短说

简短的回答是,不,没有这样的图书馆,而且我怀疑是否会有这样的图书馆。可以以高于 IEEE 双精度的精度计算数字,但通过表示为单个数字序列来实现这一点在内存方面会造成极大的浪费,并且在一般情况下不可能完全惰性地完成。例如,(+ '(0 9 0 ... ) '(0 9 1 ...))按项进行延迟计算。

长版

当将实数或表达式的值“计算”(近似)到机器精度时,计算的运算是将所需表达式的泰勒级数展开为 N 项,直到第 N+1 项的值小于机器精度此时近似会中止,因为硬件约定无法表示更多信息。

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

为了便于讨论,我们假设有人扩展了clojure.core.math以获得某种表示形式arbitrary-precision-number,作为一个软件浮点实现ByteArray,其支持通过协议在所有意图和目的上都表现为正常java.lang.Number。这种表示所实现的只是将机器 epsilon(表示错误极限)推到甚至低于 IEEE DOUBLE/64 提供的 5x10e-16 界限。构建这样的软件浮点系统是完全可行的,并且得到了相对充分的探索。但是我不知道其 Java/Clojure 实现。

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

要将这口井真正从水中吹出,在 1 光年的距离处,1e-100 度的角度偏差将导致大约 1.65117369558e-86 米的导航误差。这意味着现有的带有 IEEE DOUBLE/64 的 5x10e-16 机器 epsilon 即使对于星际导航也是完全可以接受的。

正如您提到的,将 Pi 或其他有趣的级数的小数项计算为惰性序列,这里之所以能够取得进展,只是因为目标是级数/序列的表示和研究,而不是两个或两个之间的加法、减法、乘法等。更多这样的表述。