我正在寻找一种能够在单精度和双精度之间进行转换的方法。 一个例子是划分2个整数并获得浮动结果。怎么可能?
答案 0 :(得分:8)
10 7
SWAP S>D D>F S>D D>F F/
F.
> 1.4285714 Ok
答案 1 :(得分: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/ ;
,这仍然不是标准的:它依赖于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美分,而不是四千两百三十五美元。所以,它很草率,但你可以编写一个更严格,更便携的解析词。
你可能会说,“这听起来像是额外的工作,浮点数不需要那么多的程序员纪律。”好吧,在你让这个印象化石化之前,请阅读What Every Computer Science Must Know About Floating-Point Arithmetic: - )
(对于sheepez的问题,没有远程严重的ANS Forth系统没有浮点数支持。你可能需要加载FP设施,但它们会在那里 - 并且'可加载'并不意味着“加强”或“效率低下”。请参阅Forth系统的文档。)