単精度と倍精度の間で変換できる方法を探しています。1 つの例は、2 つの整数を除算して浮動小数点数の結果を取得することです。そんなことがあるものか?
2 に答える
10 7
SWAP S>D D>F S>D D>F F/
F.
> 1.4285714 Ok
NB。rvmの答えは、別の浮動小数点スタックに依存しています。これは、標準では保証されていませんが、非常に一般的です。統合された浮動小数点スタックと2セル浮動小数点を備えたシステムである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番号の幅に関する知識に依存しています。ポータブルな方法は次の2つです。
: 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を提供する非常にまれなシステムの1つにコードを移植したい場合は、簡単な前置きでソフトウェアにFPスタックを実装できます。スタック。
それはさておき、ここにあなたの質問に対する2番目の答えがあります:小数値を処理するために浮動小数点数は必要ありません(そして場合によっては、お金のように、それらを必要としないだけでなく、したくない場合もあります彼ら)。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!)
$
その言葉についての2つのメモ。まず、システムに環境依存性があり、。を含む2倍の数を受け入れます。最後だけでなく、その中のどこにでも。次に、。が付いた数字を受け入れます。それらのどこでも、最後でも、数字はまだ2桁の小数で$ 4235.
あると解釈されます。たとえば、42ドルと35セントとして解釈され、4,235ドルではないと解釈されます。ですから、それはずさんですが、より厳密で移植性の高い構文解析単語を書くことができます。
「それは余分な作業のように聞こえますが、浮動小数点数はプログラマーの規律をそれほど要求しません」と言うかもしれません。さて、その印象を化石化させる前に、すべてのコンピュータサイエンスが浮動小数点演算について知っておくべきことを読んでください:-)
(シーペスの質問に対して、浮動小数点数をサポートしていないリモートで深刻なANS Forthシステムはありません。FP機能をロードする必要があるかもしれませんが、それらはそこにあります-そして「ロード可能」は「タックオン」を意味しません'または'効率が悪い'。Forthシステムのドキュメントを参照してください。)