【发布时间】:2020-10-14 20:32:24
【问题描述】:
我最近一直在看 Chuck Moore 的 colorForth,我发现了这段 sn-p 代码(以传统语法呈现):
: /mod for begin over over . + -if drop 2* [ swap ] next ; then over or or - 2* - next ;
有以下解释:
Divide operation: trial subtract and shift in either 0 or 1
我真的很困惑这是如何实现全除法运算的。我意识到2* 转换为 0,- 2* - 转换为 1,over or or 实现了压区操作。我也了解混合循环和 if 组合。
这就是我的不足之处。
- 似乎期望堆栈中有两个项目,分子和分母,这是有道理的。但是,初始的
for将 TOS 推送到返回堆栈,在返回堆栈上只留下一项。但是,over over操作适用于两个值,所以我不确定发生了什么。 - 他提到了减法,但没有发生反转,除了
- 2* -分支,它已经提到过移入 1。 - 我不确定如何通过仅移入 1 或 0(移入除数?)来逐位构造商。
一些想法:
- 可能取决于 Chuck 正在编程的芯片的特定字长以及添加足够次数后的翻转
- 可能缺少前导码,导致分母反转,导致每个循环都提到减法。
colorForth 和其他 Forths 之间的一些特质:
-
.是 Chuck 芯片上用于计时的 nop。 -
-是按位求逆,而不是减法。 -
or是独占的或不是包容的或
有关其他信息,以下是来源: Description of function and use of colorForth opcodes
【问题讨论】:
-
不是我明白这是做什么的,但是查看另一页 (colorforth.github.io/arith.htm),他给出了一个替代定义,其中 (i) 被除数是双精度的,(ii) 除数是负数.所以(i)会回答你的第一个问题,(ii)基本上就是你已经猜到的了。
-
...虽然,看看其他算法,也许这个版本的
/mod还有第三个参数,它是最高位的索引(例如18位字的17) -
芯片在标准 PC 硬件 (x86) 中,可能是 32 位。 1999 "Fireside chat".
-
colorForth 部分从08 min 13 secs开始。
标签: division integer-division forth