如果其中一个操作数不够大,Erlang会截断大长操作的值。 虽然如果两个操作数都足够大,它就不会截断。
199> 3656626623097354252900000 * 11111111111111111111111111.
40629184701081713921111110704819264100293971900000
200> 3656626623097354252900000 * 64.
234024103878230672185600000
有什么线索的原因?或者它确实是一个BUG?
答案 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速度”。