【问题标题】:How does the colorforth /mod algorithm work?colorforth /mod 算法是如何工作的?
【发布时间】: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 组合。

这就是我的不足之处。

  1. 似乎期望堆栈中有两个项目,分子和分母,这是有道理的。但是,初始的for 将 TOS 推送到返回堆栈,在返回堆栈上只留下一项。但是,over over 操作适用于两个值,所以我不确定发生了什么。
  2. 他提到了减法,但没有发生反转,除了 - 2* - 分支,它已经提到过移入 1。
  3. 我不确定如何通过仅移入 1 或 0(移入除数?)来逐位构造商。

一些想法:

  1. 可能取决于 Chuck 正在编程的芯片的特定字长以及添加足够次数后的翻转
  2. 可能缺少前导码,导致分母反转,导致每个循环都提到减法。

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开始。
  • a transcript

标签: division integer-division forth


【解决方案1】:

仅供参考:关于此问题的 excellent answer 由 Ulrich Hoffmann 在 comp.lang.forth 中发布。


请编辑这篇文章以使其更详细。

【讨论】:

  • 作为评论也许更好。
  • 我建议通过共同努力将所有信息放在一个有用的帖子中。所以我把这篇文章做成了一个社区维基。在 cmets 中搜索答案不是那么方便。
猜你喜欢
  • 2013-12-04
  • 2012-09-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-02
  • 2011-09-16
  • 1970-01-01
  • 2020-05-05
  • 2012-09-14
相关资源
最近更新 更多