gpt4 book ai didi

math - 在 Clojure 中使用惰性序列进行十进制扩展

转载 作者:行者123 更新时间:2023-12-04 20:44:35 25 4
gpt4 key购买 nike

是否有使用惰性序列表示 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 的十进制展开式。

最佳答案

TL;博士

简短的回答是不,没有这样的图书馆,我怀疑永远不会有。可以将数字计算到比 IEEE double 更高的精度,但是通过表示为单个数字序列来这样做在内存方面是非常浪费的,并且在一般情况下不可能完全懒惰地这样做。例如,计算 (+ '(0 9 0 ... ) '(0 9 1 ...))懒惰地按条款。

长版

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

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

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

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

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

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

关于math - 在 Clojure 中使用惰性序列进行十进制扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20256031/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com