0

我在 Ruby (MRI) 中的整数拒绝溢出。我注意到类从 fixnum 更改为 bignum,但我想知道这是如何建模的,以及 ruby​​ 使用哪种进程对这些大量整数执行算术运算。我已经在 SCHEME 以及其他环境中看到了这种行为。

我问是因为我想在 C 程序中实现类似的东西,并且想知道 bignum + bignum 如何简化为原始操作。

任何指针?

4

4 回答 4

1

Python 也这样做。

基本上,它不是将数字视为自然适合硬件架构的一串位(例如 32 位),而是将数字视为一串 32 位数字,然后实现所有算术运算来处理一个 32 进位-位数字到另一个。这还涉及随着数字的增长分配额外的 32 位数字。这比看起来容易。

例如,99 * 99 小于 100 * 100 即 10,000,因此可以假设将两个 2 位数字相乘将产生不超过 4 位的结果。当每个数字是 32 位字时,同样适用。

您可能想尝试在 Ruby 中实现它,只是为了好玩,使用一些允许固定二进制数量的类型。我相信 FixNum 类会起作用。

于 2009-10-17T21:19:09.400 回答
1

查看 C 书中的数值食谱中的第 20.6 节: http ://www.nrbook.com/a/bookcpdf.php

这是任意精度数学的一个很好的实现。如果你想变得花哨,你会创建一个重载运算符然后实现这些函数的 C++ 类。或者你可以直接打电话给他们。

于 2009-10-19T22:49:52.860 回答
0

Erlang 也是这样做的。您可以查看 erl_interface 模块中的源代码(C 语言)。

于 2009-10-17T19:35:00.150 回答
0

基本上,它归结为长加法/乘法/除法/减法。可以从那里进行很多优化(duh),因此不建议您自己进行优化。我建议查看 GMP(gnu 多精度)项目,该项目静态或动态链接到您的应用程序。它不难使用,但有一些 C++ 和其他包装器可以让您更简单地使用它。如果您正在处理浮点数,请获取 MPFR,它可以正确处理舍入。

于 2009-10-17T19:37:18.320 回答