[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Gaucheは次のタイプの数値をサポートしています。
メモリの許す限りの精度が扱えます。
分母と分子は正確な整数で表現されます。 メモリの許す限りの精度が扱えます。
実装に使われるC言語のdouble
型で表現されます。通常IEEE 64bit浮動小数点数です。
実部と虚部はそれぞれ浮動小数点の不正確な実数で表現されます。
6.2.1 数値クラス | ||
6.2.2 数値に関する述語 | ||
6.2.3 数値の比較 | ||
6.2.4 数値の演算 | ||
6.2.5 数値の変換 | ||
6.2.6 ビット演算 |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
数値オブジェクトのクラス階層を構成します。<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] | [ ? ] |
[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 |
[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 |
[R5RS]
数値zがゼロに等しければ#t
を返します。
(zero? 1) ⇒ #f (zero? 0) ⇒ #t (zero? 0.0) ⇒ #t (zero? 0.0+0.0i) ⇒ #t |
[R5RS]
実数xがそれぞれ正または負なら#t
を返します。
非実数を渡すとエラーになります。
[R5RS]
整数nがそれぞれ奇数または偶数なら#t
を返します。
非整数を渡すとエラーになります。
(odd? 3) ⇒ #t (even? 3) ⇒ #f (odd? 3.0) ⇒ #t |
nが正確な整数で、かつ内部的にそれぞれfixnumもしくはbignum
で表現されているときに#t
を返します。
通常のSchemeプログラムは整数の内部表現を気にする必要はありません。
これらの手続きは、ある種の最適化を行う低レベル手続きのために用意されています。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
=
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 |
<
x1 x2 x3 …
<=
x1 x2 x3 …
>
x1 x2 x3 …
>=
x1 x2 x3 …
[R5RS]
与えられた全ての実数xがそれぞれ単調増加、単調非減少、単調減少、単調非増加している
場合に#t
を返します。
[R5RS] 与えられた実数のうち、それぞれ最大と最小のものを返します。
与えられた実数から、最大値と最小値の二つの値を返します。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
+
z …
*
z …
[R5RS]
与えられた数の和と積をそれぞれ返します。引数が与えられない場合、
(+)
は 0、 (*)
は 1 となります。
-
z1 z2 …
/
z1 z2 …
[R5RS] 一つだけ数値が与えられた場合、それぞれnegationと逆数を返します。
2つ以上の数値が与えられた場合、それぞれ次の結果を返します。
z1 - z2 - z3 … z1 / 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のふるまいを当てにしていた場合、
速度が大きく低下する可能性があります。正確な有理数の演算は
浮動小数点数の演算よりはるかに遅いからです。
(正確な結果を得たいのでない場合は)下に述べる/.
を使うと良いでしょう。
+
、*
、-
、/
と同様ですが、引数は不正確な
数へと変換され、結果も常に不正確な数となります。
正確数による計算が不要で、bignumや正確な有理数をうっかり使ってしまう
ことによるオーバヘッドを避けたい時に便利です。
[R5RS+] 実数のzに対しては、その絶対値を返します。 複素数のzに対しては、そのmagnitudeを返します。 複素数を扱うのはGaucheの拡張です。
(abs -1) ⇒ 1 (abs -1.0) ⇒ 1.0 (abs 1+i) ⇒ 1.4142135623731 |
[R5RS] 整数n1を整数n2で割った商(quotient)および余り(remainder, modulo) を返します。 n1とn2の両方が正確な数値の時のみ、戻り値は正確な数値になります。
remainder
とmodulo
はどちらかの引数が負の時に異なる値を返します。
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 |
整数n1を整数n2で割った商(quotient)および余り(remainder) を同時に計算し、2つの値として返します。
[R5RS] 与えられた整数の、最大公約数と最小公倍数をそれぞれ返します。
[R5RS] 有理数qの分子と分母をそれぞれ返します。
[R5RS]
引数xは実数でなければなりません。floor
とceiling
はそれぞれ
xを越えない最大の整数と、xを下回らない最小の整数を返します。
truncateはxの小数部をゼロの方向に向かって切捨てた整数を返します。
roundはxに最も近い整数を返します。xの
小数部が0.5ぴったりだった場合はroundは最も近い偶数を返します。
これらは、頻出する(inexact->exact (floor x))
等を簡潔に書くための
手続きです。
min if 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 |
[R5RS][R6RS] 超越関数です。複素数も扱えます。
2引数のlog
はR6RSで追加されたもので、z2を底としたz1の対数を
返します。
[R5RS]
実数xとyに対して
(angle (make-rectangular x y))
を返します。
双曲線関数です。複素数も扱えます。
[R5RS] 複素数zの平方根のひとつを返します。枝刈りの定義はCommon Lispと同じです。 実数に対しては正の平方根を返します。
[R5RS] 複素数z1, z2に対して、 z1^z2 (z1のz2乗)を返します。
[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] | [ ? ] |
[R5RS]
二つの実数x1とx2から複素数を作ります。
make-rectangular
は x1 + ix2 を返します。
make-polar
は x1e^(ix2) を返します。
[R5RS]
複素数zを取り、実数を返します。
real-part
とimag-part
はzの実数部と虚数部をそれぞれ返し、
magnitude
とangle
はzの絶対値と偏角をそれぞれ返します。
与えられた浮動小数点数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 |
[POSIX]
これらの手続きは、浮動小数点数を分解したり合成するのに使えます。
fmod
は実数xを実数yで割った余りを返します。すなわち、
x/yを0に近いほうの整数に丸めた値をnとするとき、
x-n*yを返します。
modf
はxの少数部と整数部を返します。
frexp
は実数xを、仮数部と指数部に分解して返します。すなわち、
x = fraction * 2^exponent かつ 0 <= fraction <= 0.5
であるところのfractionとexponentを返します。
ldexp
はfrexp
の逆関数で、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 |
[R5RS] 正確な数を不正確な数に変換、またその逆を行う手続きです。
浮動小数点数の表現が有限精度であるため、任意の不正確な実数を正確な 有理数に変換することは常に可能です。しかしそれはあなたの求めるもの ではないかもしれません。次の例を見てください。
(inexact->exact 3.1415926535879) ⇒ 7074237752024177/2251799813685248 |
不正確な実数を丸めた正確な整数が欲しい場合は、floor
、ceiling
、
truncate
もしくはround
を明示的に使って下さい。
floor->exact
、round->exact
等を使うという手もあります。
(inexact->exact (round 3.1415926535879)) ⇒ 3 (round->exact 3.1415926535879) ⇒ 3 |
Gaucheは正確な複素数をサポートしません。虚数部がゼロでない不正確な
複素数をinexact->exact
に渡すとエラーとなります。
不正確な数をexact->inexact
に渡したり、または正確な数を
inexact->exact
に渡した場合、Gaucheでは今のところエラーにならず
引数がそのまま返されます。これも実装依存の振舞いなのでなるべく避けるようにして下さい。
[R5RS+] これらの手続きは数値とそれをradix進数で表現する文字列とを変換します。 radixは2から36の間でなければなりません。省略された場合は10進数とみなされます。
number->string
は数値zを取り文字列を返します。
zが正確な整数以外の場合、radixは10でなければなりません。
10より大きいradixに関しては、小文字のアルファベットが桁として使われます。
但し、省略可能な引数use-upper?に真の値が与えられた場合は大文字のアルファベットが
使われます。use-upper?引数はGaucheの拡張です。
string->number
は文字列stringを取り数値を返します。
不正確な数値は10進数表記しか認識されません。与えられた文字列が数値を構成しない
場合は#f
が返されます。
数値への強制型変換手続きです。
objをそれぞれ数値もしくは正確な整数と解釈して返します。
数値と文字列に対してのメソッドは定義されています
(文字列はstring->numberを使って変換されます。
数値として解釈できない文字列に関しては0が返されます)。
その他のobjについては単に0が返されます。
x->integer
は、objが数値として表現できるけれど正確な整数では
ない場合、round
とinexact->exact
によって正確な整数に変換します。
他のクラスはこのメソッドを定義することにより、独自の変換関数を提供することができます。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
これらの手続きは整数を半無限のビットベクタとして扱います。 正の整数の場合、数値の左側に無限に0が続いていると見倣されます。 負の整数の場合、数値は2の補数で表現され、左側に無限に1が続いていると見倣されます。
APIはSLIBの“logical”モジュールに合わせてあります。
整数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] |
2つ以上の整数n1, n2 …の、それぞれビット論理積、 ビット論理和、ビット排他的論理積を返します。
整数nのビット否定を返します。
≡ (not (zero? (logand n1 n2 …)))
整数nのindex目のビットが1ならば#t
を、0ならば#f
を
返します。
整数nのstartビット目(含む)からendビット目(含まない)までを 取り出した数値を返します。start < end でなければなりません。
bitが真の値なら、整数nのindexビット目をセットした数値を 返します。 bitが偽の値なら、整数nのindexビット目をリセットした数値を 返します。
正確な整数を返します。この整数の各ビットは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" |
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 |
正確な整数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.