For Development HEAD DRAFTSearch (procedure/syntax/module):

11.20 srfi.94 - 型を制限した数値関数

Module: srfi.94

このモジュールは実数および正確な整数に特化した数値演算関数を提供します。 定義域や値域の型を制約するという意味では scheme.fixnum (scheme.fixnum - R7RS fixnum参照) や scheme.flonum ((scheme.flonum - R7RS flonum)参照) と似ていますが、 このSRFIの関数はそれらのモジュールよりは広い範囲をカバーします (例えばreal-*手続きは正確な整数を含めた全ての実数を 対象としますし、integer-*手続きはfixnumだけでなくbignumも 扱えます)。

このモジュール自体は完全性のために用意してあります。 一般的に有用と思われる関数については組み込みになっているので、 わざわざこのモジュールをuseする必要はありません。 さらに、SRFI-94の手続きのいくつかはGaucheの組み込み手続きと同じ名前を 持ちながら振る舞いが多少異なったりするので、 srfi.94をまるごとインポートすると思いがけない副作用があるかもしれません。 特定の、SRFI-94特有の手続きを使いたい場合は、それに絞ってインポートすることを お勧めします。

以下の手続きは組み込みになっています。詳しくは数値の演算を参照してください。

real-exp          real-tan          atan              make-rectangular
real-ln           real-asin         real-sqrt         make-polar
real-sin          real-acos         integer-expt
real-cos          real-atan         real-expt

以下の手続きはこのモジュールで定義され、インポートすると 組み込み手続きをシャドウします。違いについてはそれぞれの エントリの記述を参照してください。

quotient     modulo       remainder    mod         abs
Function: real-log base x

[SRFI-94]{srfi.94} 引数は非負の実数でなければなりません。 baseを底とするxの対数を(/ (real-ln x) (real-ln base)) で計算して返します。

R7RSのlogxを最初に取り、 省略可能なbaseで底を指定することに注意してください。 Gaucheがこの手続きを組み込みとして提供していないのは、 引数順の混乱を避けるためです。

Function: integer-sqrt n

[SRFI-94]{srfi.94} これはexact-integer-sqrtと同じです (数値の演算参照)。

Function: integer-log base k

[SRFI-94]{srfi.94} 引数は正確な整数でなければならず、baseは正数、 xは非負でなければなりません。

(<= (expt base n) k)となるような最大の正確な整数nを返します。

引数の順序はreal-logと同じ、すなわちlogとは異なります。

(integer-log 2 1500) ⇒ 10
Function: abs x

[SRFI-94]{srfi.94} Gauche組み込みのabsは実数でない複素数を取ることができて、 その場合はmagnitudeのように振る舞いますが、 この手続きはエラーを投げます。

Function: quo n d
Function: mod n d
Function: rem n d

[SRFI-94]{srfi.94} quotientmoduloremainderの実数への拡張版です。

ndで割った時の商および余りを返します。 引数は整数である必要はありません。両方とも正確数であれば結果も正確数となります。

quo(truncate (/ n d))を、 rem(- n (* d (quo n d)))を、 そしてmod(- n (* d (floor (/ n d))))を返します。

註: R6RSは異なる除算オペレータ、divmoddiv0、およびmod0を定義しました(数値の演算参照)。 これらも非整数を取ることができますが、残念なことに SRFI-94とは振る舞いが異なります。SRFI-94のquoは R6RSのdiv0と、SRFI-94のremは R6RSのmod0と、それぞれ同じふるまいです。

(quo 2/3 1/5)    ⇒ 3
(mod 2/3 1/5)    ⇒ 1/15
(rem 2/3 1/5)    ⇒ 1/15

(quo 2/3 -1/5)   ⇒ -3
(mod 2/3 -1/5)   ⇒ -2/15
(rem 2/3 -1/5)   ⇒ 1/15

(quo -2/3 1/5)   ⇒ -3
(mod -2/3 1/5)   ⇒ 2/15
(rem -2/3 1/5)   ⇒ -1/15

(quo -2/3 -1/5)  ⇒ 3
(mod -2/3 -1/5)  ⇒ -1/15
(rem -2/3 -1/5)  ⇒ -1/15

;; 比較のため: R6RS手続き
(use gauche.base)
(div 2/3 1/5)    ⇒ 3
(mod 2/3 1/5)    ⇒ 1/15
(div0 2/3 1/5)   ⇒ 3
(mod0 2/3 1/5)   ⇒ 1/15

(div 2/3 -1/5)   ⇒ -3
(mod 2/3 -1/5)   ⇒ 1/15
(div0 2/3 -1/5)  ⇒ -3
(mod0 2/3 -1/5)  ⇒ 1/15

(div -2/3 1/5)   ⇒ -4
(mod -2/3 1/5)   ⇒ 2/15
(div0 -2/3 1/5)  ⇒ -3
(mod0 -2/3 1/5)  ⇒ -1/15

(div -2/3 -1/5)  ⇒ 4
(mod -2/3 -1/5)  ⇒ 2/15
(div0 -2/3 -1/5) ⇒ 3
(mod0 -2/3 -1/5) ⇒ -1/15
Function: quotient n d
Function: modulo n d
Function: remainder n d

[SRFI-94]{srfi.94} SRFI-94のバージョンは、引数が正確な整数でなければエラーを投げます。 それ以外は組み込みと同じように振る舞います (数値の演算参照)。



For Development HEAD DRAFTSearch (procedure/syntax/module):
DRAFT