[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.2 数値

Gaucheは次のタイプの数値をサポートしています。

多倍長の正確な整数

メモリの許す限りの精度が扱えます。

多倍長の正確な非整数の有理数

分母と分子は正確な整数で表現されます。 メモリの許す限りの精度が扱えます。

浮動小数点の不正確な実数

実装に使われるC言語のdouble型で表現されます。通常IEEE 64bit浮動小数点数です。

浮動小数点の不正確な複素数

実部と虚部はそれぞれ浮動小数点の不正確な実数で表現されます。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.2.1 数値クラス

Builtin Class: <number>
Builtin Class: <complex>
Builtin Class: <real>
Builtin Class: <rational>
Builtin Class: <integer>

数値オブジェクトのクラス階層を構成します。<complex><number>を継承し、<real><complex>を継承し、 <rational><real>を継承し、 <integer><rational>を継承します。

これらのクラスはR5RSで定義されている数値の階層とは必ずしも対応しません。 特に、<integer>クラスのインスタンスはR5RSでいうexact integerのみになります。

 
(integer? 1)        ⇒ #t
(is-a? 1 <integer>) ⇒ #t
(is-a? 1 <real>)    ⇒ #t

(integer? 1.0)        ⇒ #t
(is-a? 1.0 <integer>) ⇒ #f
(is-a? 1.0 <real>)    ⇒ #t

(class-of (expt 2 100)) ⇒ #<class <integer>>
(class-of (sqrt -3)) ⇒ #<class <complex>>

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.2.2 数値に関する述語

Function: number? obj
Function: complex? obj
Function: real? obj
Function: rational? obj
Function: integer? obj

[R5RS] objがそれぞれ数、複素数、実数、有理数、整数ならば#tを返します。 Gaucheでは、数の集合は複素数の集合と同一であり、有理数の集合は実数の集合と同一 (浮動小数点数が有限精度であるため)です。

 
(complex? 3+4i)   ⇒ #t
(complex? 3)      ⇒ #t
(real? 3)         ⇒ #t
(real? -2.5+0.0i) ⇒ #t
(real? #e1e10)    ⇒ #t
(integer? 3+0i)   ⇒ #t
(integer? 3.0)    ⇒ #t
Function: exact? obj
Function: inexact? obj

[R5RS] objがそれぞれ正確な数、不正確な数ならば#tを返します。

 
(exact? 1)       ⇒ #t
(exact? 1.0)     ⇒ #f
(inexact? 1)     ⇒ #f
(inexact? 1.0)   ⇒ #t

(exact? (modulo 5 3)) ⇒ #t
(inexact? (modulo 5 3.0)) ⇒ #f
Function: zero? z

[R5RS] 数値zがゼロに等しければ#tを返します。

 
(zero? 1)        ⇒ #f
(zero? 0)        ⇒ #t
(zero? 0.0)      ⇒ #t
(zero? 0.0+0.0i) ⇒ #t
Function: positive? x
Function: negative? x

[R5RS] 実数xがそれぞれ正または負なら#tを返します。 非実数を渡すとエラーになります。

Function: odd? n
Function: even? n

[R5RS] 整数nがそれぞれ奇数または偶数なら#tを返します。 非整数を渡すとエラーになります。

 
(odd? 3)     ⇒ #t
(even? 3)    ⇒ #f
(odd? 3.0)   ⇒ #t
Function: fixnum? n
Function: bignum? n

nが正確な整数で、かつ内部的にそれぞれfixnumもしくはbignum で表現されているときに#tを返します。 通常のSchemeプログラムは整数の内部表現を気にする必要はありません。 これらの手続きは、ある種の最適化を行う低レベル手続きのために用意されています。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.2.3 数値の比較

Function: = z1 z2 z3 …

[R5RS] 与えられた全ての数値zが等しければ#tを返します。

 
(= 2 2)          ⇒ #t
(= 2 3)          ⇒ #f
(= 2 2.0)        ⇒ #t
(= 2 2.0 2.0+0i) ⇒ #t
(= 2/4 1/2)      ⇒ #t
Function: < x1 x2 x3 …
Function: <= x1 x2 x3 …
Function: > x1 x2 x3 …
Function: >= x1 x2 x3 …

[R5RS] 与えられた全ての実数xがそれぞれ単調増加、単調非減少、単調減少、単調非増加している 場合に#tを返します。

Function: max x1 x2 …
Function: min x1 x2 …

[R5RS] 与えられた実数のうち、それぞれ最大と最小のものを返します。

Function: min&max x1 x2 …

与えられた実数から、最大値と最小値の二つの値を返します。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.2.4 数値の演算

Function: + z …
Function: * z …

[R5RS] 与えられた数の和と積をそれぞれ返します。引数が与えられない場合、 (+) は 0、 (*) は 1 となります。

Function: - z1 z2 …
Function: / z1 z2 …

[R5RS] 一つだけ数値が与えられた場合、それぞれnegationと逆数を返します。

2つ以上の数値が与えられた場合、それぞれ次の結果を返します。

 
z1 - z2 - z3z1 / z2 / z3
 
(- 3)       ⇒ -3
(- -3.0)    ⇒ 3.0
(- 5+2i)    ⇒ -5.0-2.0i
(/ 3)       ⇒ 1/3
(/ 5+2i)    ⇒ 0.172413793103448-0.0689655172413793i

(- 5 2 1)     ⇒ 2
(- 5 2.0 1)   ⇒ 2.0
(- 5+3i -i)   ⇒ 5.0+2.0i
(/ 14 6)      ⇒ 7/3
(/ 6+2i 2)    ⇒ 3.0+1.0i

註:0.8.8までGaucheは正確な有理数をサポートしておらず、 それ以前は除数と被除数がともに正確な数であっても商が整数にならなければ 結果は非正確な数へと変換されていました。今のGaucheはそうではありません。

既存のコードが以前のGaucheのふるまいを当てにしていた場合、 速度が大きく低下する可能性があります。正確な有理数の演算は 浮動小数点数の演算よりはるかに遅いからです。 (正確な結果を得たいのでない場合は)下に述べる/.を使うと良いでしょう。

Function: +. z …
Function: *. z …
Function: -. z1 z2 …
Function: /. z1 z2 …

+*-/と同様ですが、引数は不正確な 数へと変換され、結果も常に不正確な数となります。 正確数による計算が不要で、bignumや正確な有理数をうっかり使ってしまう ことによるオーバヘッドを避けたい時に便利です。

Function: abs z

[R5RS+] 実数のzに対しては、その絶対値を返します。 複素数のzに対しては、そのmagnitudeを返します。 複素数を扱うのはGaucheの拡張です。

 
(abs -1)   ⇒ 1
(abs -1.0) ⇒ 1.0
(abs 1+i)  ⇒ 1.4142135623731
Function: quotient n1 n2
Function: remainder n1 n2
Function: modulo n1 n2

[R5RS] 整数n1を整数n2で割った商(quotient)および余り(remainder, modulo) を返します。 n1n2の両方が正確な数値の時のみ、戻り値は正確な数値になります。

remaindermodulo はどちらかの引数が負の時に異なる値を返します。 Remainder R と商 Q とは次の関係があります。

 
  n1 = Q * n2 + R

ここで商について abs(Q) = floor(abs(n1)/abs(n2)) ですから、Rの符号は常にn1と同じになります。

一方、moduloはn2が正の時はn1の符号に関わらず期待したように動作します (例: (modulo -1 n2) == n2 - 1)。 n2が負の場合は次の式によって正の場合にマップできます。

 
  modulo(n1, n2) = -modulo(-n1, -n2)

したがって、moduloの結果の符号は常にn2の符号と同じになります。

 
(remainder 10 3)    ⇒ 1
(modulo 10 3)       ⇒ 1

(remainder -10 3)   ⇒ -1
(modulo -10 3)      ⇒ 2

(remainder 10 -3)   ⇒ 1
(modulo 10 -3)      ⇒ -2

(remainder -10 -3)  ⇒ -1
(modulo -10 -3)     ⇒ -1
Function: quotient&remainder n1 n2

整数n1を整数n2で割った商(quotient)および余り(remainder) を同時に計算し、2つの値として返します。

Function: gcd n …
Function: lcm n …

[R5RS] 与えられた整数の、最大公約数と最小公倍数をそれぞれ返します。

Function: numerator q
Function: denominator q

[R5RS] 有理数qの分子と分母をそれぞれ返します。

Function: floor x
Function: ceiling x
Function: truncate x
Function: round x

[R5RS] 引数xは実数でなければなりません。floorceilingはそれぞれ xを越えない最大の整数と、xを下回らない最小の整数を返します。 truncatexの小数部をゼロの方向に向かって切捨てた整数を返します。 roundxに最も近い整数を返します。xの 小数部が0.5ぴったりだった場合はroundは最も近い偶数を返します。

Function: floor->exact x
Function: ceiling->exact x
Function: truncate->exacte x
Function: round->exact x

これらは、頻出する(inexact->exact (floor x)) 等を簡潔に書くための 手続きです。

Function: clamp x &optional min max
 
 min if x < min
 x   if min <= x <= max
 max if max < x

を返します。もしminまたはmaxが省略されるか#fが与えられたら、 それぞれ -∞ もしくは +∞ と解釈されます。 与えられた全ての数値が正確な整数の場合に限り正確な整数を返します。

 
(clamp 3.1 0.0 1.0) ⇒ 1.0
(clamp 0.5 0.0 1.0) ⇒ 0.5
(clamp -0.3 0.0 1.0) ⇒ 0.0
(clamp -5 0)        ⇒ 0
(clamp 3724 #f 256) ⇒ 256
Function: exp z
Function: log z
Function: log z1 z2
Function: sin z
Function: cos z
Function: tan z
Function: asin z
Function: acos z
Function: atan z

[R5RS][R6RS] 超越関数です。複素数も扱えます。

2引数のlogはR6RSで追加されたもので、z2を底としたz1の対数を 返します。

Function: atan y x

[R5RS] 実数xyに対して (angle (make-rectangular x y))を返します。

Function: sinh z
Function: cosh z
Function: tanh z
Function: asinh z
Function: acosh z
Function: atanh z

双曲線関数です。複素数も扱えます。

Function: sqrt z

[R5RS] 複素数zの平方根のひとつを返します。枝刈りの定義はCommon Lispと同じです。 実数に対しては正の平方根を返します。

Function: expt z1 z2

[R5RS] 複素数z1, z2に対して、 z1^z2 (z1z2乗)を返します。

Function: fixnum-width
Function: greatest-fixnum
Function: least-fixnum

[R6RS] These procedures return the width of fixnum (w), the greatest integer representable by fixnum (2^w - 1), and the least integer representable by fixnum (- 2^w), respectively. You might want to care the fixnum range when you are writing a performance-critical section.

These names are defined in R6RS. Common Lisp and ChezScheme have most-positive-fixnum and most-negative-fixnum.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.2.5 数値の変換

Function: make-rectangular x1 x2
Function: make-polar x1 x2

[R5RS] 二つの実数x1x2から複素数を作ります。 make-rectangularx1 + ix2 を返します。 make-polarx1e^(ix2) を返します。

Function: real-part z
Function: imag-part z
Function: magnitude z
Function: angle z

[R5RS] 複素数zを取り、実数を返します。 real-partimag-partzの実数部と虚数部をそれぞれ返し、 magnitudeanglezの絶対値と偏角をそれぞれ返します。

Function: decode-float x

与えられた浮動小数点数xに対して、 3つの正確な整数からなるベクタ #(m, e, sign) を返します。ここで、

 
  x = (* sign m (expt 2.0 e))
  sign は 1, 0 または -1.

です。このAPIはChezSchemeから取られました。

 
(decode-float 3.1415926)
 ⇒ #(7074237631354954 -51 1)
(* 7074237631354954 (expt 2.0 -51))
 ⇒ 3.1415926
Function: fmod x y
Function: modf x
Function: frexp x
Function: ldexp x n

[POSIX] これらの手続きは、浮動小数点数を分解したり合成するのに使えます。 fmodは実数xを実数yで割った余りを返します。すなわち、 x/yを0に近いほうの整数に丸めた値をnとするとき、 x-n*yを返します。 modfxの少数部と整数部を返します。 frexpは実数xを、仮数部と指数部に分解して返します。すなわち、 x = fraction * 2^exponent かつ 0 <= fraction <= 0.5 であるところのfractionexponentを返します。 ldexpfrexpの逆関数で、x * 2^n を返します。

 
(fmod 32.1 10.0)  ⇒ 2.1
(fmod 1.5 1.4)    ⇒ 0.1
(modf 12.5)       ⇒ 0.5 and 12.0
(frexp 3.14)      ⇒ 0.785 and 2
(ldexp 0.785 2)   ⇒ 3.14
Function: exact->inexact z
Function: inexact->exact z

[R5RS] 正確な数を不正確な数に変換、またその逆を行う手続きです。

浮動小数点数の表現が有限精度であるため、任意の不正確な実数を正確な 有理数に変換することは常に可能です。しかしそれはあなたの求めるもの ではないかもしれません。次の例を見てください。

 
(inexact->exact 3.1415926535879)
  ⇒ 7074237752024177/2251799813685248

不正確な実数を丸めた正確な整数が欲しい場合は、floorceilingtruncateもしくはroundを明示的に使って下さい。 floor->exactround->exact等を使うという手もあります。

 
(inexact->exact (round 3.1415926535879)) ⇒ 3

(round->exact 3.1415926535879)           ⇒ 3

Gaucheは正確な複素数をサポートしません。虚数部がゼロでない不正確な 複素数をinexact->exactに渡すとエラーとなります。

不正確な数をexact->inexactに渡したり、または正確な数を inexact->exactに渡した場合、Gaucheでは今のところエラーにならず 引数がそのまま返されます。これも実装依存の振舞いなのでなるべく避けるようにして下さい。

Function: number->string z &optional radix use-upper?
Function: string->number string &optional radix

[R5RS+] これらの手続きは数値とそれをradix進数で表現する文字列とを変換します。 radixは2から36の間でなければなりません。省略された場合は10進数とみなされます。

number->stringは数値zを取り文字列を返します。 zが正確な整数以外の場合、radixは10でなければなりません。 10より大きいradixに関しては、小文字のアルファベットが桁として使われます。 但し、省略可能な引数use-upper?に真の値が与えられた場合は大文字のアルファベットが 使われます。use-upper?引数はGaucheの拡張です。

string->numberは文字列stringを取り数値を返します。 不正確な数値は10進数表記しか認識されません。与えられた文字列が数値を構成しない 場合は#fが返されます。

Generic Function: x->number obj
Generic Function: x->integer obj

数値への強制型変換手続きです。 objをそれぞれ数値もしくは正確な整数と解釈して返します。 数値と文字列に対してのメソッドは定義されています (文字列はstring->numberを使って変換されます。 数値として解釈できない文字列に関しては0が返されます)。 その他のobjについては単に0が返されます。 x->integerは、objが数値として表現できるけれど正確な整数では ない場合、roundinexact->exactによって正確な整数に変換します。

他のクラスはこのメソッドを定義することにより、独自の変換関数を提供することができます。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.2.6 ビット演算

これらの手続きは整数を半無限のビットベクタとして扱います。 正の整数の場合、数値の左側に無限に0が続いていると見倣されます。 負の整数の場合、数値は2の補数で表現され、左側に無限に1が続いていると見倣されます。

APIはSLIBの“logical”モジュールに合わせてあります。

Function: ash n count

整数nを左に整数countビットだけシフトします。 countが負であれば、-countだけnを右にシフトします。

 
; Note: 6  ≡ [...00110], and
;       -6 ≡ [...11010]
(ash 6 2)   ⇒ 24  ;[...0011000]
(ash 6 -2)  ⇒ 1   ;[...0000001]
(ash -6 2)  ⇒ -24 ;[...1101000]
(ash -6 -2) ⇒ -2  ;[...1111110]
Function: logand n1 n2 …
Function: logior n1 n2 …
Function: logxor n1 n2 …

2つ以上の整数n1, n2 …の、それぞれビット論理積、 ビット論理和、ビット排他的論理積を返します。

Function: lognot n

整数nのビット否定を返します。

Function: logtest n1 n2 …

(not (zero? (logand n1 n2 …)))

Function: logbit? index n

整数nindex目のビットが1ならば#tを、0ならば#fを 返します。

Function: bit-field n start end

整数nstartビット目(含む)からendビット目(含まない)までを 取り出した数値を返します。start < end でなければなりません。

Function: copy-bit index n bit

bitが真の値なら、整数nindexビット目をセットした数値を 返します。 bitが偽の値なら、整数nindexビット目をリセットした数値を 返します。

Function: copy-bit-field n start end from

正確な整数を返します。この整数の各ビットはstart番目のビット(この ビットを含む)からend番目のビット(このビットは含まない)の部分以外 はnと同じで、この区間のビットは、正確な数fromの下位 (end-start)ビットのコピーです。

 
(number->string (copy-bit-field #b10000000 1 5 -1) 2)
  ⇒ "10011110"

(number->string (copy-bit-field #b10000000 1 7 #b010101010) 2)
  ⇒ "11010100"
Function: logcount n

nが正なら、nのビットのうち1の個数を返します。n が負なら、nの2に関する補数のビットのうち0の個数を返します。

 
(logcount 0)      ⇒ 0
(logcount #b0010) ⇒ 1
(logcount #b0110) ⇒ 2
(logcount #b1111) ⇒ 4

(logcount #b-0001) ⇒ 0  ;; 2の補数:  ....111111
(logcount #b-0010) ⇒ 1  ;; 2の補数:  ....111110
(logcount #b-0011) ⇒ 1  ;; 2の補数:  ....111101
(logcount #b-0100) ⇒ 2  ;; 2の補数:  ....111100
Function: integer-length n

正確な整数nを表現するのに必要な最小ビット数を返します。負の数は2 の補数で表現されるものと仮定しています。符号用のビットは考慮しません。

 
(integer-length 255)  ⇒ 8
(integer-length 256)  ⇒ 9

(integer-length -256)  ⇒ 8
(integer-length -257)  ⇒ 9

[ < ] [ > ]   [ << ] [ Up ] [ >> ]

This document was generated by Shiro Kawai on November, 22 2009 using texi2html 1.78.