在Forth中实现取幂

时间:2014-01-15 06:41:57

标签: forth gforth

我正在使用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的工作方式一无所知,因为我在网上看到的大多数循环示例都让Foss的新人感到困惑和混乱。

我的实施有什么问题?

2 个答案:

答案 0 :(得分:5)

  • 1 swap错了。 ?do希望下限位于顶部 叠加。
  • loop身体错了。这两个边界将从数据堆栈中删除,因此使用rot访问取幂基不起作用。
: myexp ( u1 u2 -- u3 ) \ u3 = u1^u2
   over swap 1 ?do over * loop nip ;

答案 1 :(得分:1)

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

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

注意...有关详细信息,请参阅 Exponentiation of real numbers 上的问题的答案。