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

Math Clojure中使用惰性序列的十进制扩展,math,clojure,floating-point,Math,Clojure,Floating Point,在Clojure中是否有使用惰性序列表示十进制扩展的包 例如,语法如下 (defn r `(B N x_1 x_2 x_3 ...)) 可以表示基数B中的实数r,带有十进制扩展(数学表示法) 具有整数有效位N和十进制数字0≤ x_i≤ B-1 如果类型足够“智能”,它可以将实数的不同十进制扩展作为有效输入处理,例如(10 0 9 9…和(10 1),并以后一种形式一致地输出十进制扩展。它还应该能够处理溢出的数字,比如将(10 0 15)减少到(10 1 5) 使用实数的惰性序列表示而不是通常的

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

例如,语法如下

(defn r `(B N x_1 x_2 x_3 ...))
可以表示基数
B
中的实数
r
,带有十进制扩展(数学表示法)

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

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

使用实数的惰性序列表示而不是通常的十进制展开是否有任何障碍?我不知道与浮点相比,它的效率有多高,但它可以方便地进行涉及实数的严格精确运算。例如,我认为有一些算法可以递归地计算π和e的十进制展开式。

TL;博士 简单的回答是,没有,没有这样的图书馆,我怀疑将来是否会有这样的图书馆。计算数字的精度可能高于IEEE双精度,但通过表示为一个单位数序列来计算数字在内存方面是非常浪费的,并且在一般情况下不可能完全惰性地进行。例如,按术语惰性地计算
(+'(090…)(091…)

长版本 当“计算”(近似)实数或表达式的值到机器精度时,计算的运算是所需表达式到N项的展开,在此之前,N+1项的值小于机器精度,此时由于硬件约定无法表示更多信息,近似将中止

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

为了便于讨论,我们假设有人扩展到具有某种表示形式的
任意精度数
,这是一种基于
字节数组
的软件浮点实现,该字节数组通过协议显示为正常的
java.lang.number
。该表示法实现的所有功能是将机器ε(表示误差极限)推出,甚至低于IEEE DOUBLE/64提供的5x10e-16界限。构建这样一个软件浮点系统是完全可行的,并且探索得比较好。然而,我不知道它的Java/Clojure实现

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

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


正如您提到的,将Pi或其他有趣序列的小数项计算为一个惰性序列,在这里,只有当目标是表示和研究一个序列/序列,而不是加法、减法,两个或多个这样的表示之间的乘法和soforth。

在中检查了数学部分并在中进行了一些查询之后,我找不到任何库可以这样做,但这听起来像是一个不错的项目:)同意,听起来像是一个很酷的库的机会。
r = N . x_1 x_2 x_3 ...