如何划分两个整数并在Forth中得到浮点数?

Mar*_*man 3 math floating-point forth floating-point-precision

我正在寻找一种能够在单精度和双精度之间进行转换的方法.一个例子是划分2个整数并获得浮动结果.怎么可能?

Jul*_*ren 7

NB.rvm的答案依赖于一个单独的浮点堆栈,虽然不是标准所保证的,但它非常常见.在kForth上,您可以编写具有统一浮点堆栈和两个单元浮点数的系统

: s>f  s>d d>f ;
: r/ ( n n -- r )  \ 'r' for floating-point; 'f' for flags, true/false.
  swap s>f rot s>f f/ ;
Run Code Online (Sandbox Code Playgroud)

,这仍然不是标准的:它依赖于FP数量在堆栈上有多宽的知识.这是两种便携方法:

: r/ ( n1 n2 -- r )
  locals| n2 n1 | 
  n1 s>f n2 s>f f/ ;

: r/ ( n1 n2 -- r )
  >r s>f r> s>f f/ ;
Run Code Online (Sandbox Code Playgroud)

虽然您最好的选择是宣布环境依赖性并继续前进.一个单独的浮点堆栈确实有​​帮助,几乎一切都是这样做的,如果您想要将代码移植到为您提供统一FP的非常罕见的系统之一,那么简短的前奏可以在软件中实现FP堆栈堆.

除此之外,这里是你问题的第二个答案:你不需要浮点数来处理小数值(在某些情况下,就像金钱一样,你不仅不需要它们而且不需要它们他们).Forth使您可以非常轻松地使用具有缩放运算符和自定义数字输出的固定精度数字.

自定义数字输出的示例:

: .$ ( $ -- )
  s>d <# # # [char] . hold #s [char] $ hold #> type ;

100 .$   \ outputs: $1.00
1525 .$   \ outputs: $15.25
Run Code Online (Sandbox Code Playgroud)

缩放分割的一个例子:

\ what's 14 divided by three, with four fractional digits of precision?

14 1000 3 */   \ result: 4666  -- use a word like .$ to display it as 4.666
Run Code Online (Sandbox Code Playgroud)

(注意n1 n2 n3 */n1 n2 * n3 /- 阅读规范更准确.)

: cents ( n -- $ ) ;
: dollars ( n -- $ )  100 * ;
: $ ( "$" -- $ )
  parse-word evaluate d>s ;

\ what's 14 dollars divided by 3?
14 dollars 3 / .$   \ outputs: $4.66

\ what's 42.35 dollars divided by 2?

$ 42.35 2 / .$   \ outputs: $21.17  (note the loss of a penny!)
Run Code Online (Sandbox Code Playgroud)

关于那个$词的两个注释.首先,它对系统的环境依赖性接受为带有a的两倍数.在它的任何地方,而不是在最后.其次,它接受带有数字的数字.在它们的任何地方,甚至在最后,但数字仍被解释为具有两个小数位 - 例如,$ 4235.被解释为42美元和35美分,而不是四千两百三十五美元.所以,它很草率,但你可以编写一个既更严格又更便携的解析词.

你可能会说,"这听起来像是额外的工作,浮点数不需要那么多的程序员纪律." 那么,在你让这个印象化石化之前,请阅读每个计算机科学必须知道的关于浮点运算的内容 :-)

(对于sheepez的问题,没有远程严重的ANS Forth系统没有浮点数支持.你可能需要加载FP设施,但它们会在那里 - 并且'可加载'并不意味着'加上' '或'效率低'.请咨询您的Forth系统的文档.)