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
[SRFI-94]{srfi.94}
引数は非負の実数でなければなりません。
baseを底とするxの対数を(/ (real-ln x) (real-ln base))
で計算して返します。
R7RSのlogはxを最初に取り、
省略可能なbaseで底を指定することに注意してください。
Gaucheがこの手続きを組み込みとして提供していないのは、
引数順の混乱を避けるためです。
[SRFI-94]{srfi.94}
引数は正確な整数でなければならず、baseは正数、
xは非負でなければなりません。
(<= (expt base n) k)となるような最大の正確な整数nを返します。
引数の順序はreal-logと同じ、すなわちlogとは異なります。
(integer-log 2 1500) ⇒ 10
[SRFI-94]{srfi.94}
Gauche組み込みのabsは実数でない複素数を取ることができて、
その場合はmagnitudeのように振る舞いますが、
この手続きはエラーを投げます。
[SRFI-94]{srfi.94}
quotient、modulo、remainderの実数への拡張版です。
nをdで割った時の商および余りを返します。 引数は整数である必要はありません。両方とも正確数であれば結果も正確数となります。
quoは(truncate (/ n d))を、
remは(- n (* d (quo n d)))を、
そしてmodは(- n (* d (floor (/ n d))))を返します。
註: R6RSは異なる除算オペレータ、div、mod、
div0、および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