scheme - Guile Scheme 解释器中奇怪的乘法行为

标签 scheme mit-scheme guile

我在 OS X 上的 Guile 1.8.8 解释器中练习Scheme。我注意到一些有趣的事情。

这是expt函数,它基本上是求幂expt(b,n) = b^n:

 (define (square x) (* x x))
 (define (even? x) (= (remainder x 2) 0))
 (define (expt b n) 
      (cond ((= n 0) 1)
        ((even? n) (square (expt b (/ n 2))))
        (else (* b (expt b (- n 1))))
      ))

如果我尝试一些输入

 > (expt 2 10)
 1024
 > (expt 2 63)
 9223372036854775808

奇怪的部分来了:

 > (expt 2 64)
 0

更奇怪的是,直到n=488它一直保持在0:

 > (expt 2 487)
 0
 > (expt 2 488)
 79916762888089401123.....
 > (expt 2 1000)
 1071508607186267320948425049060....
 > (expt 2 10000)
 0

当我使用 repl.it 尝试此代码时在线翻译,它按预期工作。那么Guile到底出了什么问题

(注意:在某些方言中,remainder 函数被称为 mod。)

最佳答案

我最近fixed Guile 2.0 中存在此错误。当 C 编译器开始优化溢出检查时,该错误就出现了,其理论基础是,如果发生有符号整数溢出,则行为是未指定的,因此编译器可以做任何它喜欢做的事情。

关于scheme - Guile Scheme 解释器中奇怪的乘法行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14495636/

相关文章:

scheme - 如何在方案中将数字分解为整数和小数部分?

scheme - 控制计划中的评估(贵重)

stream - 方案中的流问题

scheme - 错误: Unbound variable in Scheme

lisp - 访问方案中高阶过程的输入

recursion - 在递归过程中显示到输出端口 - 方案

ubuntu - guile-config 运行失败

lisp - Scheme 中的二叉搜索树,如果 BST 中存在值,则尝试使用 Dr. Racket 简单地返回 true 或 false。错误

scheme - Scheme 的尾递归。解码树

recursion - 有人可以解释递归在这些过程中是如何工作的吗