浮動小数点数を認識するためにテキスト・インタープリターで使用されるルールについては、 Number Conversion を参照してください。
Gforth には別個の浮動小数点スタックがありますが、 ドキュメントでは一緒に統一した表記が使用されています9。
浮動小数点数は、 不注意な人にとっては多くの不快な驚きをもたらします(たとえば、浮動小数点の加算は結合的(associative)ではありません)。 また、 用心深い人にとってもいくつかの不快な驚きさえあります。 自分が何をしているのか理解していない場合、 または得られる結果が完全に偽物であることを気にしない場合を除き、 これらを使用すべきではありません。 浮動小数点数の問題(およびその回避方法)について知りたい場合は、 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現在)。
整数と浮動小数点の間の変換:
s>f
( n – r ) floating-ext “s-to-f”
d>f
( d – r ) floating “d-to-f”
f>s
( r – n ) floating-ext “f-to-s”
f>d
( r – d ) floating “f-to-d”
算術演算:
f+
( r1 r2 – r3 ) floating “f-plus”
f-
( r1 r2 – r3 ) floating “f-minus”
f*
( r1 r2 – r3 ) floating “f-star”
f/
( r1 r2 – r3 ) floating “f-slash”
fnegate
( r1 – r2 ) floating “f-negate”
fabs
( r1 – r2 ) floating-ext “f-abs”
fcopysign
( r1 r2 – r3 ) gforth-1.0 “fcopysign”
r3 は r1 から絶対値を取得し r2 から符号を取得します
fmax
( r1 r2 – r3 ) floating “f-max”
fmin
( r1 r2 – r3 ) floating “f-min”
floor
( r1 – r2 ) floating “floor”
次に小さい整数値に向かって丸めます。 つまり、 負の無限大に向かって丸めます。
fround
( r1 – r2 ) floating “f-round”
最も近い整数値に丸めます(訳注: 0.5e – 0, 0.50e – 0, 0.51e – 1, 1.5e – 2, ... ??)
ftrunc
( r1 – r2 ) floating-ext “f-trunc”
0 に向かって丸める(正数でも負数でも)
f**
( r1 r2 – r3 ) floating-ext “f-star-star”
r3 は r1 の r2 乗です
fsqrt
( r1 – r2 ) floating-ext “f-square-root”
fexp
( r1 – r2 ) floating-ext “f-e-x-p”
fexpm1
( r1 – r2 ) floating-ext “f-e-x-p-m-one”
r2=e**r1−1
fln
( r1 – r2 ) floating-ext “f-l-n”
flnp1
( r1 – r2 ) floating-ext “f-l-n-p-one”
r2=ln(r1+1)
flog
( r1 – r2 ) floating-ext “f-log”
常用対数(decimal logarithm)
falog
( r1 – r2 ) floating-ext “f-a-log”
r2=10**r1
f2*
( r1 – r2 ) gforth-0.2 “f2*”
r1 に 2.0e0 を掛けた値
f2/
( r1 – r2 ) gforth-0.2 “f2/”
r1 に 0.5e0 を掛けた値
1/f
( r1 – r2 ) gforth-0.2 “1/f”
1.0e0 を r1 で割った値
ベクトル演算:
v*
( f-addr1 nstride1 f-addr2 nstride2 ucount – r ) gforth-0.5 “v-star”
ドット積(dot-product): r=v1*v2 v1 の最初の要素は f_addr1 にあり、 次の要素は f_addr1+nstride1 というようになります(v2 も同様)。 どちらのベクトルにも ucount の数の要素があります。
faxpy
( ra f-x nstridex f-y nstridey ucount – ) gforth-0.5 “faxpy”
vy=ra*vx+vy
浮動小数点演算の角度はラジアン(radians)で指定します(完全な円は 2πラジアンです)。
fsin
( r1 – r2 ) floating-ext “f-sine”
fcos
( r1 – r2 ) floating-ext “f-cos”
fsincos
( r1 – r2 r3 ) floating-ext “f-sine-cos”
r2=sin(r1), r3=cos(r1)
ftan
( r1 – r2 ) floating-ext “f-tan”
fasin
( r1 – r2 ) floating-ext “f-a-sine”
facos
( r1 – r2 ) floating-ext “f-a-cos”
fatan
( r1 – r2 ) floating-ext “f-a-tan”
fatan2
( r1 r2 – r3 ) floating-ext “f-a-tan-two”
r1/r2=tan(r3) ANS Forth ではそこまで求められてはいないのですが、 おそらくこれが fsincos
の逆になることを意図していて、 gforth ではそのようになっています。
fsinh
( r1 – r2 ) floating-ext “f-cinch”
fcosh
( r1 – r2 ) floating-ext “f-cosh”
ftanh
( r1 – r2 ) floating-ext “f-tan-h”
fasinh
( r1 – r2 ) floating-ext “f-a-cinch”
facosh
( r1 – r2 ) floating-ext “f-a-cosh”
fatanh
( r1 – r2 ) floating-ext “f-a-tan-h”
pi
( – r ) gforth-0.2 “pi”
Fconstant
(定数) – r は値 pi です(π)。 円の面積と直径の比率。
浮動小数点演算に関する特別な問題の 1 つは、 等価性の比較が、 成功するはずなのに失敗することがよくあることです。 このため、 多くの場合、 近似的等価性が好まれます(ただし、 自分が何をしているのかを理解しておく必要があります)。 また、 IEEE NaN の比較があなたの予想とは異なる場合があることにも注意してください。 比較ワードは以下のとおりです:
f~rel
( r1 r2 r3 – flag ) gforth-0.5 “f~rel”
相対誤差を含む近似等価性: |r1-r2|<r3*|r1+r2|
f~abs
( r1 r2 r3 – flag ) gforth-0.5 “f~abs”
Approximate equality with absolute error: |r1-r2|<r3.< 絶対誤差を伴う近似等価性: |r1-r2|<r3
f~
( r1 r2 r3 – flag ) floating-ext “f-proximate”
r1 と r2 が等しいかどうかを比較するための ANS Forth ワードごたまぜ: r3>0 なら f~abs
; r3=0 なら
ビット単位の比較; r3<0 なら fnegate f~rel
f=
( r1 r2 – f ) gforth-0.2 “f-equals”
f<>
( r1 r2 – f ) gforth-0.2 “f-not-equals”
f<
( r1 r2 – f ) floating “f-less-than”
f<=
( r1 r2 – f ) gforth-0.2 “f-less-or-equal”
f>
( r1 r2 – f ) gforth-0.2 “f-greater-than”
f>=
( r1 r2 – f ) gforth-0.2 “f-greater-or-equal”
f0<
( r – f ) floating “f-zero-less-than”
f0<=
( r – f ) gforth-0.2 “f-zero-less-or-equal”
f0<>
( r – f ) gforth-0.2 “f-zero-not-equals”
f0=
( r – f ) floating “f-zero-equals”
f0>
( r – f ) gforth-0.2 “f-zero-greater-than”
f0>=
( r – f ) gforth-0.2 “f-zero-greater-or-equal”
IEEE754 の特別な値は、 たとえばゼロで除算することによって導出できます。 最も一般的なものは、使いやすいように浮動小数点定数として定義されています。
infinity
( – r ) gforth-1.0 “infinity”
浮動小数点数 (正の)無限大(floating point infinity)
-infinity
( – r ) gforth-1.0 “-infinity”
浮動小数点数 負の無限大(-infinity)
NaN
( – r ) gforth-1.0 “NaN”
浮動小数点数 NaN(Not a Number)
この一緒にした表記から、 浮動小数点数だけを分離するだけで、
簡単に分離された表記にできます。 例えば: ( n r1 ur2 -- r3 )
は ( n u -- ) ( F: r1
r2 -- r3 )
になります