- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试了一些来自 Rosettacode 的例子并遇到提供的 Ackermann 示例的问题:当“未修改”运行它时(我将 utf-8 变量名替换为 latin-1 变量名),我得到(类似,但现在可复制):
$ perl6 t/ackermann.p6
65533
19729 digits starting with 20035299304068464649790723515602557504478254755697...
Cannot unbox 65536 bit wide bigint into native integer
in sub A at t/ackermann.p6 line 3
in sub A at t/ackermann.p6 line 11
in sub A at t/ackermann.p6 line 3
in block <unit> at t/ackermann.p6 line 17
$ perl6 t/ackermann.p6
65533
19729 digits starting with 20035299304068464649790723515602557504478254755697...
Numeric overflow
in sub A at t/ackermann.p6 line 8
in sub A at t/ackermann.p6 line 11
in block <unit> at t/ackermann.p6 line 17
use v6;
proto A(Int \m, Int \n) { (state @)[m][n] //= {*} }
multi A(0, Int \n) { n + 1 }
multi A(1, Int \n) { n + 2 }
multi A(2, Int \n) { 3 + 2 * n }
multi A(3, Int \n) { 5 + 8 * (2 ** n - 1) }
multi A(Int \m, 0 ) { A(m - 1, 1) }
multi A(Int \m, Int \n) { A(m - 1, A(m, n - 1)) }
# Testing:
say A(4,1);
say .chars, " digits starting with ", .substr(0,50), "..." given A(4,2);
A(4, 3).say;
最佳答案
请先阅读JJ的回答。它很轻松,并导致了这个答案,这实际上是对它的详细阐述。
TL;博士 A(4,3)
是一个非常大的数字,在这个宇宙中无法计算。但是 raku(do) 会尝试的。如果您使用缓存版本,那么您将超过与内存分配和索引相关的合理限制,如果不使用与数字计算相关的限制。
I try some examples from Rosettacode and encounter an issue with the provided Ackermann example
Arbitrary precision is preferred (since the function grows so quickly)
Int
是
arbitrary precision . raku 解决方案使用它们来计算可能的最高级答案。只有当你让它尝试做不可能的事情时,它才会失败。
When running it "unmodified" (I replaced the utf-8 variable names by latin-1 ones)
A(4,3)
Line 将代码从现实中的可计算转变为现实中的不可计算。
Here's a caching version of that ... to make A(4,2) possible
A(4,2)
解决方案的长度接近 20,000 位。
A(4,2)
. Phix版本有这样的评论:
optimised. still no bignum library, so ack(4,2), which is power(2,65536)-3, which is apparently 19729 digits, and any above, are beyond (the CPU/FPU hardware) and this [code].
A(4,2)
的解决方案是最先进的。
A(4,3)
在实践中是不可计算的
Even for small inputs (4,3, say) the values of the Ackermann function become so large that they cannot be feasibly computed, and in fact their decimal expansions cannot even be stored in the entire physical universe.
A(4,3).say
是不可能的(在这个宇宙中)。
Cannot unbox 65536 bit wide bigint into native integer
第一条错误消息提到了这行代码:
proto A(Int \m, Int \n) { (state @)[m][n] //= {*} }
state @
是
anonymous state array variable .
@
变量使用
the default concrete type乐的
abstract array type .这种默认数组类型在实现复杂性和不错的性能之间提供了平衡。
A(4,2)
索引(
m
和
n
)保持足够小,以便计算完成而不会溢出默认数组的索引限制。
A(4,3)
该算法生成一个 65536 位(8192 字节)宽的整数索引。这样的整数可能与 265536、
20,032 decimal digit number 一样大.但允许的最大索引是 64 位 native 整数。因此,除非您注释掉使用数组的缓存行,否则对于
A(4,3)
程序最终抛出异常:
Cannot unbox 65536 bit wide bigint into native integer
A(4,3)
.此外,一个 64 位整数已经是一个相当大的索引(
9,223,372,036,854,775,807
)。
Array::Sparse
所以我将在下面简要讨论,因为其他问题可能会对这些可能性感兴趣。
my @array;
@array[2**29]++; # works
@array[2**30]++; # could not allocate 8589967360 bytes
@array[2**60]++; # Unable to allocate ... 1152921504606846977 elements
@array[2**63]++; # Cannot unbox 64 bit wide bigint into native integer
(注释掉错误行以查看以后/更大的错误。)
@
(
does Positional
) 支持稀疏数组等内容的数据类型。
Array::Sparse
确实如此) )。
BigArray
那么缓存行可以替换为:
my @array is BigArray;
proto A(Int \𝑚, Int \𝑛) { @array[𝑚][𝑛] //= {*} }
同样,这仍然不足以存储完全计算的中期结果
A(4,3)
但我的观点是展示自定义数组类型的使用。
Numeric overflow
当您注释掉缓存时,您会得到:
Numeric overflow
Int
切换来保持理智的一种尝试。到
Num
(一个浮点数)在完全耗尽 RAM 之前。但随后计算
A(4,3)
最终甚至会溢出双浮点数。
关于biginteger - perl6 : Cannot unbox 65536 bit wide bigint into native integer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54528903/
我正在尝试执行 JavaPairRDD 和 JavaPairRDD 的 leftOuterJoin> 并且函数签名返回类型是 JavaPairRDD>>> 这里可选的是 com.google.comm
我正在尝试按元素的频率对元素进行排序 import java.io.BufferedReader; import java.io.IOException; import java.io.InputSt
这个问题已经有答案了: Is List a subclass of List? Why are Java generics not implicitly polymorphic? (19 个回答) 已
编辑:问题已解决:请参阅 Karim SNOUSSI 的答案和我在下面的评论。 这是我在堆栈溢出时遇到的第一个问题,所以我可能不会一开始就把所有事情都做对。对此感到抱歉。此外,我对 Java 和一般
#include #include using namespace std; class Integer { public: int i; Integer (int ll
我不明白: ArrayList list = new ArrayList(); Collection list1 = new ArrayList(); 类 ArrayList扩展实现接口(interf
我编写了:。它成功了。我不知道为什么?
我编写了:。它成功了。我不知道为什么
我编写了:。它成功了。我不知道为什么?
Collectors.counting()返回 long此方法中每个键的值: private static Map countDuplicates(HashSet cards) { retur
我正在尝试通过搜索旧元素并将其替换为新元素来更新节点的元素。但是有一个我不明白的错误。是什么导致我的代码出现该错误,我该如何解决?错误; The method update(Integer, Inte
我有一个称为 client 的表,其中有一列称为created_time ,所以实际上我想绘制一个 map ,以便我可以知道在哪一年和哪一个月添加了多少客户?现在的要求是假设在 2018 年 11 月
这个问题已经有答案了: Is Java "pass-by-reference" or "pass-by-value"? (91 个回答) 已关闭 8 年前。 我对 ArrayList Collecti
我意识到下面的代码是正确的 Integer.MIN_VALUE == -Integer.MIN_VALUE == Math.abs(Integer.MIN_VALUE) 这是因为当我们取反-21474
我有以下类 AccountWebappGridRow,它扩展了 AccountGridRow: public class AccountWebappGridRow extends AccountGri
我正在学习 Haskell 并看到了函数组合。 尝试复合 map和 foldl mapd = (map.foldl) 比 test = (mapd (\x y -> x + y ) [1,2,3,4]
我有两个相同大小的数组和两个方法。 public class Client { private static int[] ints; private static final int
我喜欢 Java 8 中的 Streams 概念。现在我想借助 Java Streams 将 Java 中的 Map 转换为排序列表。我只想显示列表而不将其存储在任何地方。我希望在结果列表中有这个输出
我有一个数据库表,其中包含电视节目类型列表和关联的 ARGB 颜色值,用于在显示电视指南时突出显示 Android ListView 中的电视节目。流派表看起来像这样... id genre
我有一个 Integer 类,它应该模拟一个整数 mod n。因此,它具有如下构造函数: Integer::Integer(int x) : m(x), n(0) { } Integer::I
我是一名优秀的程序员,十分优秀!