3

我正在寻找一种能够在单精度和双精度之间进行转换的方法。一个例子是将 2 个整数相除并得到一个浮点结果。这怎么可能?

4

2 回答 2

8
10 7 

SWAP  S>D D>F  S>D D>F  F/

F.

> 1.4285714  Ok

另见: http: //forth.sourceforge.net/std/dpans/dpans12.htm

于 2011-07-13T13:24:07.397 回答
7

注意。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/ ;

,这仍然不是标准的:它依赖于关于 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/ ;

尽管您最好的选择是仅声明环境依赖性并继续进行。一个单独的浮点堆栈确实有​​帮助,几乎所有事情都是这样,如果你想将你的代码移植到为你提供统一 FP 的非常罕见的系统之一,一个简短的前奏可以在软件中实现一个 FP 堆栈堆。

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

自定义数值输出的示例:

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

100 .$   \ outputs: $1.00
1525 .$   \ outputs: $15.25

比例划分的示例:

\ 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

(请注意,这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!)

$关于这个词的两个注释。首先,它对接受带有 . 在它的任何地方,而不仅仅是在最后。其次,它接受带有 a 的数字。在它们的任何地方,即使在末尾,但数字仍被解释为具有两个小数位——例如,$ 4235.被解释为 42 美元和 35 美分,而不是 40235 美元。所以,它很草率,但你可以写一个更严格、更便携的解析词。

你可能会说,“这听起来像是额外的工作,浮点数不需要太多的程序员纪律。” 好吧,在你让这种印象变成化石之前,请阅读每门计算机科学都必须了解的关于浮点运算的知识:-)

(对于sheepez 的问题,没有不支持浮点数的远程严重ANS Forth 系统。您可能需要加载FP 工具,但它们会在那里——“可加载”并不意味着“附加” ' 或 ' 效率较低'。请查阅 Forth 系统的文档。)

于 2011-08-02T04:19:55.070 回答