ANSI Forth BASE上限与gforth上限,往返?

时间:2017-05-16 14:24:47

标签: base gforth

摆弄gforth版本的BASE表明,BASE可用于超过大多数语言允许的值。例如,这会以十进制打印数字 0ABC(base 15950),反之亦然:

gforth -e '15950 base ! ABC decimal . cr bye'
gforth -e '2544200462 15950 base ! . cr bye'

输出:

2544200462
ABC

无需编写其他 Forth 字样,的有意义转换的默认Gforth和 ANSI Forth BASE上限是多少? 来自不同基数?

(暂时忽略将现有字符集映射到描述某些任意基数的复杂性,或者想象一个无限的分形字符集,当需要新字符时,它会增加30-150度的衬线。)

2 个答案:

答案 0 :(得分:3)

根据standard,它是

  

BASE

     

( - a-addr)

     

a-addr是包含当前数字转换基数{{2 ... 36}}的单元格的地址。

所以它是2..36。

这是有道理的,不是吗?

  • 下限为2,因为任何小于2的位数都是无用的。
  • 上限为36,因为它允许0-9和A-Z作为数字,不区分大小写。

答案 1 :(得分:0)

Gforth v0.7.2 + dfsg1-1.1 中的BASE的最大值,(用于将ABC转换为数字并再次返回),似乎意外地大 960,383,882 。通过比较Gforth的输出与calc(任意精度计算器,可以在大约一秒钟内输出(27^3)!的所有76,976位数)来找到并测试该数字,并在下面使用{{ 1}}被认为是正确的:

calc

测试# Output Gforth calculation of (12*b^2)+(11*b^1)+(10*b^0) to # base 10 and inversely back to base b. b=960383882 n=ABC ; bd=$(gforth -e $b' base ! '$n' decimal . cr bye') gforth -e "${bd} dup . cr $b"' base ! . cr bye' calc "10*($b^2)+11*($b^1)+12*($b^0)" | xargs echo 9223372018618121954 ABC 9223372018618121954 # It fails here: b=960383883 n=ABC ; bd=$(gforth -e $b' base ! '$n' decimal . cr bye') gforth -e "${bd} dup . cr $b"' base ! . cr bye' calc "10*($b^2)+11*($b^1)+12*($b^0)" | xargs echo -9223372035883752001 -A8f 9223372037825799615 的上限,(上面代码中的$n)等待...