joh*_*ers 5 lisp common-lisp integer-arithmetic
我在Lisp教科书中读到这篇文章:
Lisp可以用数字执行一些惊人的壮举,特别是与大多数其他语言相比时.例如,这里我们使用函数
expt
来计算53的53的幂:
CL> (expt 53 53)
24356848165022712132477606520104725518533453128685640844505130879576720609150223301256150373
Run Code Online (Sandbox Code Playgroud)
大多数语言会在涉及如此大数目的计算中窒息.
是的,这很酷,但作者没有解释为什么Lisp可以比其他语言更容易,更快地完成这项工作.
当然有一个简单的原因,任何人都可以解释一下吗?
sds*_*sds 12
这是一个很好的例子,"更坏并不总是更好".
"传统"语言,如C/C++/Java,基于硬件功能具有有限范围的整数算术,例如,int32_t
- 当有结果不适合32位时,有符号的32位数字无声地溢出.这是非常快的,并且通常看起来足够实用,但导致很难发现错误.
Lisp采取了不同的方法.
它有一个"小"的未装箱整数类型fixnum
,当fixnum算术的结果不适合a时fixnum
,它会自动且透明地提升到任意大小bignum
,因此你总能获得数学上正确的结果.这意味着,除非编译器能够证明结果是a fixnum
,否则它必须添加代码以检查是否bignum
必须分配.实际上,这应该在现代建筑上花费0,但是在4年前制作时这是一个非平凡的决定.
"传统"语言,当他们提供bignum算术时,以"图书馆"的方式做到这一点,即,
BigInteger.add(a,b)
而不是a+b
;请注意,Lisp方法非常符合Lisp的做法,即以可能的额外复杂性为代价做正确的事情.它也体现在自动化内存管理中,现在已成为主流,但在过去遭到了恶意攻击.整数算术的lisp方法现在已经在其他一些语言中使用(例如,python),所以进展正在发生!
归档时间: |
|
查看次数: |
417 次 |
最近记录: |