Lisp/基本からさらに一歩進んで/数値
Common Lisp は、ほとんどのプログラミング言語よりもたくさんの複雑な計算課題を実行するためのサポートを行います。これは、巨大な整数、有理数、複素数などへのサポートと、それらのために機能する関数によって達成されるものです。
数値の型
編集数値型の階層は以下の様になります。
- 数値 number
- 実数 real
- 有理数 rational
- 整数 integer
- 定整数 fixnum
- 任意長整数 bignum
- 分数 ratio
- 整数 integer
- 小数 float
- 短小精度浮動小数点 short-float
- 単精度浮動小数点 single-float
- 倍精度浮動小数点 double-float
- 高精度浮動小数点 long-float
- 有理数 rational
- 複素数 complex
- 実数 real
定整数(fixnum)と任意長整数(bignum)
編集定整数(fixnum)はあまり大きすぎない数値で、非常に頻繁に処理される整数です。Common Lisp の実装にもよるのですが、 [-215,215-1] の範囲の全ての整数は定整数とみなされます。
任意長整数(bignum)は定整数ではない整数です。この整数のサイズは Lisp に割り当てられたメモリの量によります。メモリの割り当ての限りにおいてどれだけでも大きな値をとることが出来ます。しかし、その代わり定整数の処理に比べて非常に処理が遅くなります。もちろんだからといってこれが役に立たないというわけではありません。
分数(ratio)
編集分数(ratio)は二つの整数の比、割合を表したものです。分数は 分子 / 分母 という形を持ちます。割り算の機能を持つ / 関数は、引数が整数か分数の場合、常に分数を作り出します。例えば、 (/ 1 2)
の結果は 1/2 であって 0.5 ではありません。他の数値計算の関数も分数でしっかりと動きます。
小数(float)
編集小数(float)は浮動小数点数を省略した言い方で、ほとんどのプログラミング言語では非整数の数値を表すのに使用されるデータ型です。 Common Lisp では4つの小数を表す型があり、処理系の実装によるのですが、型ごとに精確性が高いものを提供します。デフォルトでは処理系は小数を短小精度浮動小数点(short-float)とみなしますが、これは正確性に限界があります。もっと正確な小数を入力するには、たとえば倍精度浮動小数点(double-float)での "1.0d0" のような他の記法が使用されなければなりません。
複素数(complex)
編集複素数(complex)は文字通り複素数を表すデータ型です。複素数の表記法は #C(実数部 虚数部) の形式となります。実数部と虚数部の部分は有理数か、小数となります。全ての数値計算の処理においては複素数の処理が可能です。また、乗数や対数などの、その他の多くの関数においても複素数は拡張可能です。
数値処理
編集次に挙げる関数は全ての種類の数値のために定義されています。
- 演算処理を行う +, -, *, / は非常にわかりやすい(これらの命令は二つ以上の引数を取れることに注意)
- sin, cos, tan, acos, asin, atan は三角法を処理する関数を提供します。
- 同じように、例えば asinh のように三角法を処理する関数の末尾に h を付加すると、双曲線関数に対応するものを提供します。
- exp と expt では乗数を処理します。 exp は引数を一つとりネイピア数の乗算(ex)したものを返します。一方で expt は底と指数の二つの引数をとります。
- sqrt は数値の平方根を返します。
- log は対数を計算します。もし引数が一つの場合は、自然対数が計算され、引数が二つの場合は二番目の引数が底として使用されます。
- conjugate は数値の複素共役を返します。実部のための返り値はその値自身となります。
- abs は数値の絶対値(あるいは大きさ)を返します。
- phase は数値の複素数の偏角(成分)を返します。
- signum は引数自身の同じ位相の数値を単位の大きさと共に返します。
次の関数は特殊な数値のために定義されています。 gcd と lcm は複数の整数から最大公約数と最小公倍数を計算します。 isqrt は与えられた自然数の平方根の整数で最大のものを返します。 cis は eiφ を計算します。φ はラジアンとして与えられた数値です。
数値の比較
編集次の関数は数値の比較に使用することができます。それぞれの関数はどんな数値も引数として取ることができます。
- = は全ての引数が同じ数値なら t を返します。さもなければ nil を返します。小数の不正確な特質のため、小数の比較には使用しないことをおすすめします。
- /= は全ての引数が違う数値なら t を返します。
(/= a b c)
は常に(not (= a b c))
と同じではないことに注意しましょう。 - <, <=, >, >= は引数が正しく一連の連なりを持っているかチェックします。この関数は複素数に使うことはできません。
- max と min はそれぞれ対照的に、引数の最大のものと最小のものを返します。
数値型の操作
編集これらの関数はある型の数値を別の型に変換するときに使われます。
- floor, ceiling, truncate, round は数値と除数の二つの引数をとります。返り値は商(整数)と剰余(=数値-商×除数)となります。それぞれの方法は、関数に応じた商を選ぶためのものです。 floor は 比=数値 / 除数 未満の最も大きい整数を返します。 ceiling は 比 を超える最も大きい整数を返します。 truncate は 比 の最大の絶対値でもあり、最小の絶対値でもあるような値と同じものを整数として返します。そして round は 比 に最も近い整数を返します。(もし比に最も近い値が二つある場合は偶数の方を選びます。)これらの関数は二つの値を返すということにも注意です。(複数値も参照してください。)
- ffloor, fceiling, ftruncate, fround は上の関数と同じですが、商が小数型の数値に変換されます。
- (mod a b) は (floor a b) の二番目の返り値を返します。
- (rem a b) は (truncate a b) の二番目の返り値を返します。
- float は最初の引数(ただし実数)を小数に変換します。これを使用することで有理数における計算速度の低下を防ぐことが出来るでしょう( example 1 を参照のこと)二つ目の任意の引数は prototype として扱われるもので、小数でなければなりません。結果はプロトタイプとしての小数型となります。
- rational あるいは rationalize は実数を有理数に変換するものです。引数が小数の有理数ならば、数学的に小数と同じ値の有理数に変換されます。 rationalize は入力された小数のほぼ正確な数値を返します。前者の関数は巨大な分母の分数を作り出すのに使用されます。そのため考えているほどには役に立たないかもしれません。
- numerator と denominator はそれぞれ有理数の分子と分母を返します。
- complex は実部と虚部から複素数を作成します。realpart と imagpart はそれぞれ数値の実部と虚部を返します。
数値に関する述語
編集述語は真の場合は nil でない返り値を、偽の場合は nil を返します。
- zerop は引数が 0 かどうかを判定します。(Lisp には複数のゼロが存在します。 - 整数の 0, 実数の 0, 複素数の 0, マイナスの 0 も含まれるでしょう。)
- plusp, minusp は引数が正か負かを判定します。
- evenp, oddp は引数の整数が偶数か奇数かを判定します。
- integerp は引数が整数かどうかを判定します。(上記の整数のツリーに含まれるものです。)
- floatp は引数が小数かどうかを判定します。
- rationalp は引数が有理数かどうかを判定します。
- realp は引数が実数かどうかを判定します。
- complexp は引数が複素数かどうかを判定します。