我在Ruby中的整数(MRI)拒绝溢出。我注意到从fixnum到bignum的类更改,但我想知道这是如何建模的以及ruby使用什么类型的进程来对这些大整数执行算术。我在SCHEME和其他环境中都看到过这种行为。
我问,因为我想在C程序中实现类似的东西,并且想知道bignum + bignum如何简化为原始操作。
任何指针?
答案 0 :(得分:1)
Python也是这样做的。
基本上,不是将数字视为自然适合硬件体系结构的位串(例如32位),而是将数字视为32位数字的字符串,然后实现所有算术运算以处理进位从一个32位数到另一个。这还涉及在数字变长时分配额外的32位数字。这比看起来容易。
例如,99 * 99小于100 * 100即10,000,因此可以假设乘以两个2位数将产生不超过4位的结果。当每个数字是32位字时,同样适用。
你可能想尝试在Ruby中实现它,只是为了好玩,使用一些允许固定二进制数量的类型。我相信FixNum类可以工作。
答案 1 :(得分:1)
请参阅C book的数字食谱中的第20.6节:http://www.nrbook.com/a/bookcpdf.php
这是任意精度数学的一个很好的实现。如果你想得到想象,你会创建一个重载运算符然后实现这些函数的C ++类。或者你可以直接打电话给他们。
答案 2 :(得分:0)
Erlang也这样做。您可以查看erl_interface模块中的源代码(在C中)。
答案 3 :(得分:0)
基本上,归结为长加法/乘法/除法/减法。有很多优化可以从那里完成(duh),所以不推荐自己滚动。我建议您查看GMP(gnu多精度)项目,该项目将静态或动态链接到您的应用程序中。它并不难使用,但它有一些C ++和其他包装器可以让你更简单地使用它。如果您正在进行浮点运算,请获取MPFR,它可以正确处理舍入。