本節では (rnrs arithmetic flonums (6)) ライブラリについて述べる。
本節では fl、 fl1、 fl2 等を flonum でなければならない引き数の仮引き数名に用い、 ifl を整数の値を持たなければならない引き数、すなわち integer-valued? 述語が真を返す flonum の名前に用いる。
obj が flonum であれば #t を返し、そうでなければ #f を返す。
x の最もよい flonum 表現を返す。
戻り値は引き数に数値上最も近いものである。
注: flonum が二進の浮動小数点で表されている場合、最下位ビットが 0 である浮動小数点表現を優先することで同程度に近い数を選ぶべきである。
これらの手続きは、引き数が(順に)、等しい場合、単調増加している場合、単調減少している場合、単調減少していない場合、単調増加していない場合 #t を返し、そうでなければ #f を返す。これらの述語は推移的でなければならない。
(fl= +inf.0 +inf.0) ⇒ #t (fl= -inf.0 +inf.0) ⇒ #f (fl= -inf.0 -inf.0) ⇒ #t (fl= 0.0 -0.0) ⇒ #t (fl< 0.0 -0.0) ⇒ #f (fl= +nan.0 fl) ⇒ #f (fl< +nan.0 fl) ⇒ #f
これらの数値述語は flonum の特定の性質を検査して #t か #f を返す。 flinteger? 手続きはオブジェクトが整数であるかどうかを検査し、 flzero? は 0 と fl=? であるかどうかを検査し、 flpositive? は 0 より大きいか検査し、 flnegative? は 0 より小さいか検査し、 flodd? は奇数であるか検査し、 fleven? は偶数であるか検査し、 flfinite? は無限大や非数でないか検査し、 flinfinite? は無限大であるかどうか検査し、 flnan? は非数であるかどうか検査する。
(flnegative? -0.0) ⇒ #f (flfinite? +inf.0) ⇒ #f (flfinite? 5.0) ⇒ #t (flinfinite? 5.0) ⇒ #f (flinfinite? +inf.0) ⇒ #t
注: (flnegative? -0.0) は #f を返さなければならない。さもなくは (fl< -0.0 0.0) との対応を失うことになる。これは IEEE 754 [7] によれば #f である。
これらの手続きは引き数の最大値と最小値を返す。これらの手続きは引き数のひとつ以上が非数であれば常に非数を返す。
これらの手続きは各々の flonum の引き数の flonum の和や積を返す。一般に、これらは数学上の和や積をもっともよく近似した flonum を返すべきである(IEEE の二進浮動小数点数を使って flonum を表している実装系では、「もっともよく」の意味は IEEE 標準で定義されている)。
(fl+ +inf.0 -inf.0) ⇒ +nan.0 (fl+ +nan.0 fl) ⇒ +nan.0 (fl* +nan.0 fl) ⇒ +nan.0
ふたつ以上の引き数を与えた場合、これらの手続きは各々の引き数の差や商を左結合で求めて返す。引き数がひとつの場合には、引き数の加法や乗法の逆元を返す。一般に、これらは数学上の差や商をもっともよく近似した flonum を返すべきである(IEEE の二進浮動小数点数を使って flonum を表している実装系では、「もっともよく」の意味は IEEE 標準で定義されている)。
(fl- +inf.0 +inf.0) ⇒ +nan.0
未定義の商については、 fl/ は IEEE 標準に規定されているように振る舞う。
(fl/ 1.0 0.0) ⇒ +inf.0 (fl/ -1.0 0.0) ⇒ -inf.0 (fl/ 0.0 0.0) ⇒ +nan.0
fl の絶対値を返す。
これらの手続きは整数論上の整数の除算を実装し、 R6RS:翻訳:R6RS:11.7.3.1 Integer division に規定されている対応する数学演算の結果を返す。除数が 0 の場合には、これらの手続きは非数を返すか何らかの未規定の flonum を返すこともある。
(fldiv fl1 fl2) ⇒ fl1 div fl2 (flmod fl1 fl2) ⇒ fl1 mod fl2 (fldiv-and-mod fl1 fl2) ⇒ fl1 div fl2, fl1 mod fl2 ; two return values (fldiv0 fl1 fl2) ⇒ fl1 div0 fl2 (flmod0 fl1 fl2) ⇒ fl1 mod0 fl2 (fldiv0-and-mod0 fl1 fl2) ⇒ fl1 div0 fl2, fl1 mod0 fl2 ; two return values
こっらの手続きは fl の分母と分子を flonum として返す。戻り値は fl が既約分数で表されているものとして計算される。分母は常に正である。 0.0 の分母は 1.0 であると定義されている。
(flnumerator +inf.0) ⇒ +inf.0 (flnumerator -inf.0) ⇒ -inf.0 (fldenominator +inf.0) ⇒ 1.0 (fldenominator -inf.0) ⇒ 1.0 (flnumerator 0.75) ⇒ 3.0 ; probably (fldenominator 0.75) ⇒ 4.0 ; probably
実装系は次の振る舞いを実装するべきである。
(flnumerator -0.0) ⇒ -0.0
これらの手続きは無限大や非数でない flonum の引き数に対して整数の flonum を返す。そのような引き数に対して、 flfloor は fl よりも大きくない最大の整数の flonum を返す。 flceiling 手続きは fl より小さくない整数の flonum を返す。 fltruncate 手続きは絶対値が fl の絶対値よりも大きくなく、 fl に最も近い整数の flonum を返す。 floround 手続きは fl に最も近い整数の flonum を返し、 fl がふたつの整数の中間の数値を表している場合には偶数に丸める。
無限大や非数は整数オブジェクトではないが、これらの手続きは引き数として無限大を渡されたときには無限大を返し、非数を渡されたときには非数を返す。
(flfloor +inf.0) ⇒ +inf.0 (flceiling -inf.0) ⇒ -inf.0 (fltruncate +nan.0) ⇒ +nan.0
これらの手続きは超越関数を計算する。 flexp は底 e の fl の指数関数を計算する。一引き数の fllog 手続きは fl の(常用対数ではなく)自然対数を計算し、 (fllog fl1 fl2 は底 fl2 の fl1 の対数を計算する。 flasin、 flacos、 flatan 手続きは逆正弦、逆余弦、逆正接をそれぞれ計算する。 (flatan fl1 fl2) は fl1/fl2 の逆正接を計算する。
もととなる数学演算については R6RS:翻訳:R6RS:11.7.3.2 Transcendental functions を参照。これらの手続きが与えられた引き数に実数の結果を生成しない場合には、戻り値は非数になるか、何らかの未規定の flonum になることもある。
IEEE 二進浮動小数点演算を用いている実装系はこれらの実装について関連する標準に従うべきである。
(flexp +inf.0) ⇒ +inf.0 (flexp -inf.0) ⇒ 0.0 (fllog +inf.0) ⇒ +inf.0 (fllog 0.0) ⇒ -inf.0 (fllog -0.0) ⇒ unspecified ; if -0.0 is distinguished (fllog -inf.0) ⇒ +nan.0 (flatan -inf.0) ⇒ -1.5707963267948965 ; approximately (flatan +inf.0) ⇒ 1.5707963267948965 ; approximately
fl の主要な平方根を返す。 -0.0 に対しては flsqrt は -0.0 を返すべきである。それ以外の負数の引き数には戻り値は非数や未規定の flonum になることもある。
(flsqrt +inf.0) ⇒ +inf.0 (flsqrt -0.0) ⇒ -0.0
fl1 は非負であるか、fl1 が負数である場合は fl2 は整数オブジェクトであるべきである。 flexpt は fl1 の f2 乗を返す。 fl1 が負で fl2 整数オブジェクトでない場合は、戻り値は非数か未規定の flonum になることもある。 fl1 が 0 の場合、戻り値は 0 である。
これらのコンディション型は次のコードで定義することができる。
(define-condition-type &no-infinities &implementation-restriction make-no-infinities-violation no-infinities-violation?) (define-condition-type &no-nans &implementation-restriction make-no-nans-violation no-nans-violation?)
これらの型は無限大や非数を表現することのできない Scheme 実装系で、無限大や非数を返すと規定されている算術演算が実行されたことを表している(R6RS:翻訳:R6RS:11.7.2 Representability of infinities and NaNs 参照)。
fx に数値上最も近い flonum を返す。
注: この手続きの戻り値は fx と数値上等しくないかもしれない。これは fixnum の精度は flonum の精度より大きいからである。