2

我正在使用Gforth来尝试实现求幂。从理论上讲,我了解基于堆栈的语言应该如何运行。但是,我在 Gforth 上实现它时遇到了困难。

这是我现在拥有的:

: myexp
    1 swap ?do rot dup * rot rot loop ;

但是,当我运行它时,我看到一个堆栈下溢,如:

3 2 myexp
:1: Stack underflow
3 2 >>>myexp<<<
Backtrace:
$7F645EFD6EF0 rot
$2
$1

Gforth 的循环结构是否在循环时操纵堆栈?

我对 Forth 的工作原理一无所知,因为我在网上看到的大多数循环示例都相当复杂,而且对于 Forth 的新手来说很困惑。

我的实施有什么问题?

4

2 回答 2

6
  • 1 swap是错 的。?do想要栈顶的下界。
  • 身体loop不对劲。这两个边界已从数据堆栈中删除,因此您无法使用rot访问幂基。
: myexp ( u1 u2 -- u3 ) \ u3 = u1^u2
   over swap 1 ?do over * loop nip ;
于 2014-01-15T09:15:31.823 回答
1

我不确定如何使用 Gforth 的浮点堆栈,所以我不能给你答案,但是你可以使用 Pascal 编程技巧来定义幂运算,而不是使用循环,如下所示:

x^y = exp(y*ln(x))

注意...有关更多信息,请参阅有关实数指数的问题的答案。

于 2014-03-05T00:06:32.520 回答