Next: , Previous: , Up: Forth Tutorial   [Contents][Index]


3.26 Floating Point

Forth の浮動小数点(floating-point)(FP)の、 数値と算術演算は、 ほぼ期待された通りに機能しますが、 特筆すべき点がいくつかあります:

最初の点は Forth に固有のものではありませんが、 非常に重要で、 まだ広く知られていないため、 ここで言及します。 浮動小数点数は実数(real)ではありません。 実数(real)が持ち、 あらゆる種類の数値に期待される多くの性質(算術法則など)は、 浮動小数点数には当てはまりません。 浮動小数点演算したい場合、 浮動小数点演算の問題とその回避方法について学ぶ必要があります。 良い出発点は David Goldberg, What Every Computer Scientist Should Know About Floating-Point Arithmetic, ACM Computing Surveys 23(1):5-48, March 1991 です(訳注: https://docs.oracle.com/cd/E19957-01/806-4847/ncg_goldberg.html これが合ってるかどうか不明。一部文字化けあり2024/06現在)。

Forth ソース・コードでは、リテラル浮動小数点数には指数が必要です(例: 1e0)。これは、 1e のように短く書くことも、 +1.0e+0 のように長く書くこともでき、 その間にはさまざまなバリエーションがあります。 その理由は、 歴史的な理由により、 Forth は小数点のみ(例: 1.) の数を 2 セル整数を示すものとして通訳(interpret)するためです。 例:

2e 2e f+ f.

リテラル浮動小数点数のもう 1 つの要件は、 現在の基数が 10 進数であることです。 16 進数の 1e は整数として通訳(interpret)されます:

Forth には、Forth-2012 に準拠した浮動小数点数用の別個のスタックがあります。 このモデルの利点の 1 つは、 浮動小数点数にアクセスするときにセルが邪魔にならないこと、 またその逆も同様であることです。 Forth には、 浮動小数点スタック(FP スタック)を操作するためのワードのセットがあります: fdup fswap fdrop fover frot や (非標準の、) fnip ftuck fpick

FP 算術ワードには F という接頭辞が付きます。 通常の f+ f- f* f/ f** fnegate のほか、 他の、 関数用の多数のワード (例: fsqrt fsin fln fmin) があります。 期待されるワードの 1 つが f= ですが、 f= は標準にはありません。 浮動小数点数の計算結果は通常不正確であるため、 正確な比較は通常間違いであり、 近似的な比較を使用する必要があります。 残念ながら、この目的のための標準のワードである f~ は適切に設計されていないため、 Gforth では f~absf~rel も提供しています。

そしてもちろん、 メモリ内の浮動小数点数にアクセスするためのワード(f@ f!)や、 アドレス演算用のワード(floats float+ faligned)もあります。 メモリ内の IEEE 書式の単精度および倍精度数にアクセスするために、 sf および df プレフィックスを付けた、 これらのワードのバリエーションもあります。 その主な目的は、 外部浮動小数点数データ(ファイルから読み取られた、 またはファイルに書き込まれるデータなど)にアクセスすることです。

以下は、 ドット出力ワード(dot-product word)とその使用例です:

: v* ( f_addr1 nstride1 f_addr2 nstride2 ucount -- r )
  >r swap 2swap swap 0e r> 0 ?DO
    dup f@ over + 2swap dup f@ f* f+ over + 2swap
  LOOP
  2drop 2drop ;

create v 1.23e f, 4.56e f, 7.89e f,

v 1 floats  v 1 floats  3  v* f.

研究課題(assignment): 二次方程式を解くプログラムを作成してみましょう。 次に、 Henry G. Baker, You Could Learn a Lot from a Quadratic, ACM SIGPLAN Notices, 33(1):30-39, January 1998 を読んで、 そのプログラムを改善できるかどうか確認してください。 最後に、 元のバージョンと改良されたバージョンで異なる結果が生成されるテスト・ケースを探しましょう。

こちらも参照ください: Floating Point; Floating point stack; Number Conversion; Memory Access; Address arithmetic.


Next: Files, Previous: Alignment, Up: Forth Tutorial   [Contents][Index]