Guacheの数値型は以下の数を表現できます。
- 整数 (例: 100, 3.0)
- 分数 (例: 1/2)
- 実数 (例: 3.14, 6.2e-23)
- 複素数 (例: 0.5+0.5i)
整数や実数は以下に示すとおり普段使っている数字で表現できます。
gosh> 23
23
gosh> 3.8
3.8
gosh> -1.6
-1.6
gosh> 1.7e23
1.7e23
gosh> 1.3e-3
0.0013
整数は10進表記以外にも2進、8進、16進表記で表現できます。
2進数は0と1の列の前に#bをつけて表現できます。
gosh> #b0011
3
8進数の場合は#oを列の前につけます。
gosh> #o3271
1721
16進数の場合は#xを列の前につけます。
gosh> #xfba3
64419
また、整数はメモリの許す限りどこまでも大きな数を扱うことができます。
gosh> (fact 200)
7886578673647905035523632139321850622951359776871732632947
4253324435944996340334292030428401198462390417721213891963
8830257642790242637105061926624952829931113462857270763317
2373969889439224456214516642402540332918641312274282948532
7752424240757390324032125740557956866022603190417032406235
1700858796178922222789623703897374720000000000000000000000
000000000000000000000000000
ここでは200の階乗を計算しました。
分数は分母と分子を/で区切って表現します。
gosh> 1/2
1/2
gosh> 4/3
4/3
gosh> 6/3
2
gosh> 15/6
5/2
約分が可能な分数は約分されます。
実数はIEEEの64bit浮動少数点数で
扱われます。
gosh> 0.11
0.11
gosh> 6.2e-23
6.2e-23
複素数の記述例は以下です。
gosh> 1+i
1.0+1.0i
gosh> 2.3-1.4i
2.3-1.4i
虚部のみ記述する場合は虚数単位iの前に符号をつけてください。
gosh> +i
0.0+1.0i
gosh> -i
0.0-1.0i
実部や虚部は実数で表現されます。複素数の作り方は他にもあります。
手続きmake-rectangularは実部と虚部の値を受け取って複素数を作成します。
gosh> (make-rectangular 3 4.8)
3.0+4.8i
ここで渡した実数は直交座標系を元にした数値でした。複素数には直交座標系
以外に極座標系で表すことができます。極座標系を元にした複素数を作るには
make-polarを使います。
gosh> (make-polar 1.5 0.8)
1.0450600640207481+1.0760341363492842i
ここでは絶対値が1.5で偏角が0.8となる複素数を作成しました。
make-rectangularとmake-polarの使い方の例は以下のとおりです。
(make-rectangular 実部 虚部)
(make-polar 絶対値 偏角)
これとは逆に、複素数から実部や虚部の値、また、絶対値や偏角を取り出す
手続きがあります。
gosh> (real-part 3+4i)
3.0
gosh> (imag-part 3+4i)
4.0
gosh> (magnitude 3+4i)
5.0
gosh> (angle 3+4i)
0.9272952180016122
real-partとimage-partは実部と虚部の値を、magnitudeとangleは絶対値と偏角を複素数から取り出します。
以上が数値の表現方法と作り方です。ここでは三種類の数値の説明をしました。この数値の種類は以下の述語で区別できます。
- (number? 値)
- (rational? 値)
- (complex? 値)
- (real? 値)
- (integer? 値)
上から順に渡された値が数値、有理数(分数を含む)、複素数、実数、整数、分数かどうかを判断します。
gosh> (number? 'a)
#f
gosh> (number? 3+i)
#t
gosh> (rational? 1/2)
#t
gosh> (rational? 6/3)
#t
gosh> (rational? 2)
#t
gosh> (rational? 0.5)
#t
gosh> (rational? 3.14)
#t
gosh> (rational? 0.5+0.5i)
#f
gosh> (complex? 1+2i)
#t
gosh> (complex? 3)
#t
gosh> (real? 1.8)
#t
gosh> (real? 2-i)
#f
gosh> (real? 98)
#t
gosh> (integer? 3)
#t
gosh> (integer? 3.1)
#f
gosh> (integer? 3.0)
#t
複素数、実数、整数は数値型なのでnumber?では#tが返ります。
分数、整数は有理数なのでrational?で#tが返ります。
実数のうち分数で表現可能な数にも#tが返ります。
複素数は有理数ではないので#fが返っています。
複素数には実数と整数も含まれるのでcomplex?でも#tとなります。同様に、実数には整数も含まれるのでreal?で#tが返ります。
integer?は整数を渡せば#tが返ります。3.0は小数点付きですが整数3と同値とされ#tが返っています。
これまで述べた整数、分数、実数、複素数は数学的な数を指しており、
Scheme言語処理系の内部表現とは異なります。
さらにScheme言語の数値型は正確数と非正確数の2種類に大別できます。
これらについては「正確数と非正確数の変換」で説明します。
数の種類を判定する述語について説明しました。
種類の判定以外にも、数値の値の性質(ゼロか? 負の数か? など)を調べる述語もあります。
- (zero? 数値)
- (positive? 実数)
- (negative? 実数)
- (odd? 整数)
- (even? 整数)
名前の通り、zero?は数値が0かどうかを調べ、positive?とnegative?は渡された実数が正か負かを調べます。odd?とeven?は渡された整数が奇数か偶数かを調べます。
gosh> (zero? 0)
#t
gosh> (zero? 3)
#f
gosh> (positive? 3.1)
#t
gosh> (positive? -3.1)
#f
gosh> (negative? 3.1)
#f
gosh> (negative? -3.1)
#t
gosh> (odd? 3)
#t
gosh> (odd? 4)
#f
gosh> (even? 3)
#f
gosh> (even? 4)
#t