Erlang长64号BUG

时间:2010-08-19 17:39:51

标签: erlang 64-bit long-integer

如果其中一个操作数不够大,Erlang会截断大长操作的值。 虽然如果两个操作数都足够大,它就不会截断。

199> 3656626623097354252900000 * 11111111111111111111111111. 
40629184701081713921111110704819264100293971900000
200> 3656626623097354252900000 * 64.                     
234024103878230672185600000

有什么线索的原因?或者它确实是一个BUG?

2 个答案:

答案 0 :(得分:3)

刚刚使用GHCI(The Glasgow Haskell Interpreter)尝试了两种操作,它给出了完全相同的结果。

不确定您是否意识到这一点,但Erlang支持 bignums

  

在计算机科学中,   任意精度算术是一个   计算的技术   对数字为的数字执行   精度仅受限于   主机系统的可用内存。   这与速度形成鲜明对比   中的固定精度算术   大多数ALU硬件,通常   提供6到16的小数   数字。它也被称为bignum   算术,有时甚至   “无限精度算术”(其中   是一个用词不当,因为数量   数字是有限的和有界的   实践)。

答案 1 :(得分:2)

这不是错误。 Erlang具有任意精度整数。 (实际上,这受到机器上可用内存的限制......)

这些整数使用名为“fixnum”和“bignum”的东西实现。 Fixnum是(带符号)整数,在32位架构上适合28位,在64位架构上适合60位。附加位用于类型标记(请记住,Erlang是动态强类型的,因此需要对其值进行类型标记)。然后Erlang虚拟机切换到超过该大小的bignum。这些实施效率低得多。

在保持在fixnum范围内的基础上添加HiPE编译,对于程序的算术部分,你应该具有“接近C速度”。