検索エンジンから来た人に注意このマニュアルは、Emacs ver. 19.x 向けのマニュアルを Mule 2.x の開発にあたり邦訳したものを、 電脳外道学会がミラーリングしているものであり、旧版製品パラノイアであるところの椅子人の趣味によるものです。しかしながら、現在の Emacs の主流は ver. 20 以降であり、ver 19.x と ver 20.x とでは、仕様の違いが少なからずあります。 したがって、一般的な Emacs ユーザーにとっては、
このマニュアルと実機の動作とが符合しない場合があります。
|
GNU Emacsは 整数(integer)と 浮動小数点数(floating point number) の二つの数値データ型をサポートします。 整数は、-3、0、7、13、511のような数全部です。 整数 の値は、きっちりとその表現の値を表します。 浮動小数点数は、-4.5、0.0、2.71828のように小数部のある数です。 浮動小数点数 は、指数表記法で表現することもできます。 1.5e2は150と等しいです。 この例の`e2'は10の自乗を表わし、 それを1.5倍しています。 浮動小数点の値は厳密ではありません。 固定で有限量の精度をもっています。
浮動小数点数のサポートはEmacs 19の新機能です。 それは独立したコンパイル時オプションで制御されます。 そのためサイトによっては、 Emacsが浮動小数点をサポートしていないこともあるかもしれません。
整数値の範囲は、 マシンに依存します。 最低でも、 範囲は-134217728から134217727まで(28ビット、すなわち から ですが、 マシンによってはもっと広い範囲をとることもあります。 この章でとりあげる多くの例では、整数が28ビットと仮定しています。
Lispリーダは、 先行する省略可能な符号と最後の省略可能なピリオドを含んだ数字の列として、 整数を読み込みます。
1 ; 整数の1。 1. ; 整数の1。 +1 ; これも整数の1。 -1 ; 整数の-1。 268435457 ; 桁あふれ(overflow)のため、これも整数の1。 0 ; 整数の0。 -0 ; 整数の0。
ビットごとの演算 (see section 整数にたいするビットごとの演算) などは特にそうですが、 いろいろな整数についての関数のはたらきを理解するには、 数を2進形式でながめるのが便利です。
28桁の2進数では、 10進整数の5は以下のようになります。
0000 0000 0000 0000 0000 0000 0101
(2進整数を読みやすくするため、 4桁ごとにスペースを一つ、 8桁ごとにスペースを二つあけてあります。)
整数の-1は以下のようになります。
1111 1111 1111 1111 1111 1111 1111
28個の1で-1を表わします (これを2の補数(two's complement)表記といいます)。
負の整数の-5は-1から4を引いてできます。 10進整数の4は2進数では100です。 したがって-5は以下のようになります。
1111 1111 1111 1111 1111 1111 1011
この実装方法では、 28桁2進整数の最大値は、10進整数の134,217,727になります。 これは2進数では以下のようになります。
0111 1111 1111 1111 1111 1111 1111
算術関数は整数範囲外のチェックをしないので、 134,217,727に1を足すと値は負数の-134,217,728になります。
(+ 1 134217727) => -134217728 => 1000 0000 0000 0000 0000 0000 0000
以下の多くの関数は、 整数と同様にマーカも引数としてうけつけます(See section マーカ)。 より厳密には、 そのような関数の実引数は、整数でもマーカでもかまいません。 これがこのような引数の名前をint-or-markerとする理由です。 引数の値がマーカのとき、 マーカの位置の値が用いられ、 マーカのバッファは無視されます。
マクロのLISP_FLOAT_TYPE
を定義してコンパイルすると、
Emacsバージョン19は浮動小数点数をサポートするようになります。
浮動小数点数の正確な範囲は、
マシン個有です。
そのマシンのCのデータ型double
と同じ範囲です。
浮動小数点数の印字表現は、 (少なくとも一つの数字が続いた) 小数点か指数、 あるいはその両方を含んでいる必要があります。 たとえば、`1500.0'、`15e2'、`15.0e2'、`1.5e3'、`.15e4'は、 1500という値の浮動小数点数を、5とおりに書き表わしたものです。 `-1.0'のような負の浮動小数点数を書くのに負符号が使えます。
最近の多くの計算機では、IEEEの浮動小数点標準をサポートしています。
この標準には、浮動小数点値に加えて正の無限大と負の無限大があります。
また、NaNあるいは「非数」("not-a-number")
という値のクラスがあり、
数値関数は正解のないときこのような値を返します。
たとえば、(sqrt -1.0)
はNaNを返します。
実際の問題としては、
Emacs Lispでは異なるNaN値間の違いは重要ではありません。
どの場合にどのNaN値が使われるべきか、ということに関する
正確な規則はありません。
そのためこのマニュアルではこれらを区別しないことにします。
Emacs Lispには、NaNや無限大に対するリード構文はありません。
多分将来には、構文を作るべきでしょう。
logb
を使って、
浮動小数点数の2進指数部をとりだすことができます
(整数の対数を見積もることができます)。
この節で説明する関数は、
引数が数であるか、
またそれがどんな種類の数であるかを調べるのに使います。
関数integerp
とfloatp
には、
引数としてどんな型のLispオブジェクトでも与えることができます
(そうでなければ述語というものはあまり使えないでしょう)。
しかし、zerop
述語には、
引数として数だけが許されます。section マーカに対する述語の、
integer-or-marker-p
とnumber-or-marker-p
を参照してください。
t
を、
そうでなければnil
を返します。
floatp
はバージョン18やそれ以前のEmacsにはありません。
t
を返し、
そうでなければnil
を返します。
t
を、
そうでなければnil
を返します。
wholenump
述語("whole-number-p" という句から名づけられました)は、
引数が非負の整数であるか否かを調べ、
もしそうならt
を、
そうでなければnil
を返します。
0は非負とみなします。
t
を、
そうでなければnil
を返します。
引数は数でなければなりません。
次の二つの形式は等価です。(zerop x)
== (= x 0)
数をその数値としての等価性について調べるには、eq
を使わず、
普通は=
を使います。
同一の数値になる、多くの別々な浮動小数点数のオブジェクトがあり得ます。
それらをeq
で比べる場合、二つの値が同一のオブジェクトか
どうかを調べることになりますが、
それとは対照に、
ただ数としての値を比べたいなら=
を使います。
今のところ、
Emacs Lispの中では、整数値は一意なLispオブジェクトです。
したがって、
整数を比較する場合には、
eq
は=
と等価です。
eq
は、未知の値が数でなくともエラーをおこさず、
すべての型の引数をうけつけるので、
未知の値と整数を比較するのにeq
を使うと
便利なこともあります。
反対に、
=
は、引数が数でもマーカでもないとエラーを通知します。
しかしながら、
Emacsの将来のバージョンでは、整数の内部表現を変える可能性があるので、
整数をくらべるときにも、できるだけ=
を使う方がいいでしょう。
ここで助言があります。 浮動小数点の演算は厳密ではないので、 二つの浮動小数点値の間で、等価性を調べるのは 考えものです。 多くの場合、近い値かどうかを調べる方がいいでしょう。 以下に、 これを実行する関数をあげます。
(defvar fuzz-factor 1.0e-6) (defun approx-equal (x y) (or (and (= x 0) (= y 0)) (< (/ (abs (- x y)) (max (abs x) (abs y))) fuzz-factor)))
Common Lisp注意書き: Common Lispでは、多語整数があるので、 常に数の比較には
=
を使う必要があります。 二つの異なる整数オブジェクトが同一の数値をもつことがありうるからです。 Emacs Lispでは整数値の範囲を制限しているため、 与えられたすべての値にたいする整数オブジェクトが一意に定まります。
t
を返し、
そうでない場合nil
を返します。
t
を返し、
同じ数値である場合nil
を返します。
t
を返し、そうでない場合nil
を返します。
t
を返し、
そうでない場合nil
を返します。
t
を返し、
そうでない場合nil
を返します。
t
を返し、
そうでない場合nil
を返します。
(max 20) => 20 (max 1 2.5) => 2.5 (max 1 3 2.5) => 3
(min -4 1) => -4
整数を浮動小数点に変換するには、関数float
を使います。
float
は変更せずに返します。
浮動小数点数を整数に変換する四つの関数があります。 丸め方が違っています。 整数の引数を与えてこれらの関数を呼んでもかまいません。 そのときは引数を変更しないで返します。
divisorを指定すると、numberをdivisorで割ってから
そのfloorをとります。
これは、mod
にたいする除算に相当します。
divisorが0ならarith-error
を発生します。
Emacs Lispは伝統的な四則演算、つまり加減乗除を提供します。 除算に加えて、剰余と法の関数も用意してあります。 Lisp では伝統的であり、またよく使われるため、 1を加減算する関数もあります。
%
以外の関数は、
引数の中に浮動小数点値のものがあると浮動小数点値を返します。
重要なことですが、
GNU Emacs Lispの算術関数では桁あふれのチェックは行ないません。
ハードウェアによっては、
(1+ 134217727)
は、-134217728と評価されるでしょう。
(setq foo 4) => 4 (1+ foo) => 5
この関数は、Cの++
演算子とは違います。
変数をインクリメントさせません。
和を計算するだけです。
したがって、その後でもこうなります。
foo => 4
もし、変数をインクリメントさせたいなら、次のようにsetq
を使わなければなりません。
(setq foo (1+ foo)) => 5
+
は、0を返します。
(+) => 0 (+ 1) => 1 (+ 1 2 3 4) => 10
-
には、二つの目的があります。
反数(はんすう)と減算です。
-
に単一の引数を与えたとき、
値は引数の反数です。
複数の引数が存在する場合、
number-or-markerから全部のother-numbers-or-markersを
次々に引きます。
引数が存在しない場合、結果は0になります。
(- 10 1 2 3 4) => 0 (- 10) => -10 (-) => 0
*
は、1を返します。
(*) => 1 (* 1) => 1 (* 1 2 3 4) => 24
全部の引数が整数なら、
結果も整数になります。
つまり結果は丸められます。
ほとんどのマシンでは、
すべての除算の後、
0の方向へ丸められます。
しかし、あるマシンでは負の引数のとき異なる丸め方をすることがありえます。
これは、Lisp関数/
が、
マシン依存の丸め方を許すCの除算演算子を使って
実装されているためです。
実際にはよく知られたマシンでは標準的な方法で丸められます。
0で割るとarith-error
を発生します。(See section エラー。)
(/ 6 2) => 3 (/ 5 2) => 2 (/ 25 3 2) => 4 (/ -17 6) => -2
原理的には(/ -17 6)
の結果は、
あるマシンでは-3 になりえます。
負の引数については、 原理的には商がマシン依存のため、 余りもマシン依存になります。 しかし実際は、 すべてのよく使われるマシンでは同じように振る舞います。
divisor
が0ならarith-error
になります。
(% 9 4) => 1 (% -9 4) => -1 (% 9 -4) => 1 (% -9 -4) => -1
任意の二つの整数dividendとdivisorについて、
(+ (% dividend divisor) (* (/ dividend divisor) divisor))
は、常にdividendと等しいです。
%
とは異なり、
mod
は、
負の引数についても、よく定義された結果を返します。
そして浮動小数点の引数も許されています。
余りを計算するときに、
商を整数へ小さくなる(負の無限大の)方向へ丸めた値を用います。
divisorが0ならarith-error
になります。
(mod 9 4) => 1 (mod -9 4) => 3 (mod 9 -4) => -3 (mod -9 -4) => -1 (mod 5.5 2.5) => .5
任意の二つの数dividendとdivisorについて、 以下の
(+ (mod dividend divisor) (* (floor dividend divisor) divisor))
は、
引数が浮動小数点の場合の丸め誤差の範囲で、
常にdividendに等しいです。
floor
については、section 数の変換を参照してください。
関数ffloor
、fceiling
、
fround
、ftruncate
は、浮動小数点の引数をとり、
整数に最も近い浮動小数点値の結果を返します。
ffloor
は最も近い小さな整数を返します。
fceiling
は最も近い大きな整数です。
ftruncate
は0の方向にむかって最も近い整数です。
fround
は最も近い整数です。
計算機内部では、整数は、2進数、 すなわち(0と1の数字になった)ビット(bit)・シーケンスで表現され、 ビットごとの演算は、このようなシーケンスの個々のビットに作用します。 たとえば、桁送り(shifting)は、 ビット・シーケンス全体を左右に一つ、あるいはもっと、移動させて、 同じパターンを「移動した」のに等しいものを作りだします。
Emacs Lispのビット演算は、整数に対してのみ適用します。
lsh
(logical shiftの省略形)は、
integer1中のビットを左(countが負の場合は右)に、
countだけ桁送りし、
あいたビットに0を入れます。
count
が負の場合、
lsh
は一番左(最高位)のビットに0を入れるので、
integer1が負のときの結果は正になります。
これは後述のash
とは異なっている点です。
次の二つの例では、 ビットのパターンを一つ左に桁送りしています。 ここでは低位の8桁だけを示しています。 残りのビットはすべて0です。
(lsh 5 1) => 10 ;; 10進の5が10進の10になる。 00000101 => 00001010 (lsh 7 1) => 14 ;; 10進の7が10進の14になる。 00000111 => 00001110
例で説明したように、 ビットのパターンを一つ左に桁送りすると、 元の数の2倍の数になります。
ビットのパターンを二つ左に桁送りするとこうなります (8桁の2進数)。
(lsh 3 2) => 12 ;; 10進の3が10進の12になる。 00000011 => 00001100
一方、一つ右に桁送りするとこうなります。
(lsh 6 -1) => 3 ;; 10進の6が10進の3になる。 00000110 => 00000011 (lsh 5 -1) => 2 ;; 10進の5が10進の2になる。 00000101 => 00000010
例で説明したように、 一つ右に桁送りすると、 正の整数を2で割り小さく丸めた値になります。
関数lsh
は、
Emacs Lispの全算術関数と同様に、
桁あふれのチェックは行ないません。
したがって左への桁送りは高位ビットを捨て去り、
数の符号を変えることがあります。
28 ビット・マシンでは、134,217,727を左に桁送りすると、-2になります。
(lsh 134217727 1) ; 左に桁送りする => -2
28ビットの実装では、 引数の2進表示は、以下のようになります。
;; 10進の134,217,727 0111 1111 1111 1111 1111 1111 1111
これを左に桁送りしたのが次のものです。
;; 10進の-2 1111 1111 1111 1111 1111 1111 1110
ash
(arithmetic shift) は、
integer1中のビットを左(countが負の場合は右)に、
countだけ桁送りします。
ash
は、integer1とcountが両方とも
負である場合をのぞきlsh
と同じ結果を返します。
この場合、
lsh
は、桁送りを行なう際、その左側から0を入れますが、
ash
は、桁送りを行なう際、そこに1を入れます。
したがって、
あるビットパターンをash
で右に一つ桁送りすると、以下のようになります。
(ash -6 -1) => -3 ;; 10進の-6が10進の-3になる。 1111 1111 1111 1111 1111 1111 1010 => 1111 1111 1111 1111 1111 1111 1101
逆に、
そのビットパターンをlsh
で一つ右に桁送りすると、こうなります。
(lsh -6 -1) => 134217725 ;; 10進の-6が10進の134,217,725になる。 1111 1111 1111 1111 1111 1111 1010 => 0111 1111 1111 1111 1111 1111 1101
ほかにも例をあげます。
; 28桁2進値 (lsh 5 2) ; 5 = 0000 0000 0000 0000 0000 0000 0101 => 20 ; = 0000 0000 0000 0000 0000 0001 0100 (ash 5 2) => 20 (lsh -5 2) ; -5 = 1111 1111 1111 1111 1111 1111 1011 => -20 ; = 1111 1111 1111 1111 1111 1110 1100 (ash -5 2) => -20 (lsh 5 -2) ; 5 = 0000 0000 0000 0000 0000 0000 0101 => 1 ; = 0000 0000 0000 0000 0000 0000 0001 (ash 5 -2) => 1 (lsh -5 -2) ; -5 = 1111 1111 1111 1111 1111 1111 1011 => 4194302 ; = 0011 1111 1111 1111 1111 1111 1110 (ash -5 -2) ; -5 = 1111 1111 1111 1111 1111 1111 1011 => -2 ; = 1111 1111 1111 1111 1111 1111 1110
たとえば、4桁の2進数で、 13と12の「論理積」は12です。 1101と1100で1100になります。 両方の2進数で左側の二ビットがセットされている(値が1)ので、 戻り値の左の二つのビットはセットされます。 けれども、 右側の二ビットでは、少なくともどちらかの引数が0なので、 戻り値の右側の二ビットは0になります。
ですから、
(logand 13 12) => 12
引数が存在しない場合、結果は-1になります。
この数の2進表現は全ビットが1なので、
logand
の単位元です。
logand
にたいし一つしか引数が存在しない場合、
その引数が結果となります。
; 28桁2進値 (logand 14 13) ; 14 = 0000 0000 0000 0000 0000 0000 1110 ; 13 = 0000 0000 0000 0000 0000 0000 1101 => 12 ; 12 = 0000 0000 0000 0000 0000 0000 1100 (logand 14 13 4) ; 14 = 0000 0000 0000 0000 0000 0000 1110 ; 13 = 0000 0000 0000 0000 0000 0000 1101 ; 4 = 0000 0000 0000 0000 0000 0000 0100 => 4 ; 4 = 0000 0000 0000 0000 0000 0000 0100 (logand) => -1 ; -1 = 1111 1111 1111 1111 1111 1111 1111
logior
にたいし一つしか引数が存在しない場合、
その引数が結果となります。
; 28桁2進値 (logior 12 5) ; 12 = 0000 0000 0000 0000 0000 0000 1100 ; 5 = 0000 0000 0000 0000 0000 0000 0101 => 13 ; 13 = 0000 0000 0000 0000 0000 0000 1101 (logior 12 5 7) ; 12 = 0000 0000 0000 0000 0000 0000 1100 ; 5 = 0000 0000 0000 0000 0000 0000 0101 ; 7 = 0000 0000 0000 0000 0000 0000 0111 => 15 ; 15 = 0000 0000 0000 0000 0000 0000 1111
logxor
にたいし一つしか引数が存在しない場合、
その引数が結果となります。
; 28桁2進値 (logxor 12 5) ; 12 = 0000 0000 0000 0000 0000 0000 1100 ; 5 = 0000 0000 0000 0000 0000 0000 0101 => 9 ; 9 = 0000 0000 0000 0000 0000 0000 1001 (logxor 12 5 7) ; 12 = 0000 0000 0000 0000 0000 0000 1100 ; 5 = 0000 0000 0000 0000 0000 0000 0101 ; 7 = 0000 0000 0000 0000 0000 0000 0111 => 14 ; 14 = 0000 0000 0000 0000 0000 0000 1110
(lognot 5) => -6 ;; 5 = 0000 0000 0000 0000 0000 0000 0101 ;; は ;; -6 = 1111 1111 1111 1111 1111 1111 1010 ;; になる
以下の数学関数は、浮動小数点をサポートしている場合に有効です。 浮動小数点数だけでなく、整数を引数に与えることができます。
(asin arg)
の値は、
正弦がargとなるような-π/2から
π/2までの(境界を含む)数です。
しかし、もしargが [-1, 1] の範囲外なら、結果はNaNです。
(acos arg)
の値は、
余弦がargとなるような0からπまでの(境界を含む)数です。
しかし、もしargが [-1, 1] の範囲外なら、結果はNaNです。
(atan arg)
の値は、正接がargとなるような-π/2
からπ/2までの(境界を含まない)数です。
(log10 x)
== (log x 10)
です。
計算機プログラムは決定性があり、 真の乱数を発生できません。 ほとんどの目的のためには、疑似乱数(pseudo-random number)で十分です。 疑似乱数列は、決定性のある仕方で生成されます。 そうした乱数列は真の乱数ではありませんが、乱数列に類似した特性をもっています。 たとえば、 すべてのとり得る値は、疑似乱数列中で等しい頻度で発生します。
Emacs は、「種」(seed)となる数から疑似乱数を生成します。
与えられた種から始めて、
random
関数は、常に同じ数列を生成します。
Emacsは常に同一の種値から始めるので、
random
の返す数の列は、
実はEmacsを起動するたびに同じものになります!
たとえば、あるオペレーティング・システムでは、
Emacsを起動した後(random)
を呼び出すと、常に-1457731を返し、
もう一度呼び出すと-7692030を返します。
この復元性はデバッグを行なう際、役立ちます。
真に予見不能な乱数群を必要とする場合は、
(random t)
を実行します。
これは、現在の時刻とEmacsのプロセスID番号とをもとに
新しい種の選択を行ないます。
もし limitが正整数なら、 値は非負かつlimit未満になります。
limitがt
なら、
現在の時刻とEmacsのプロセスID番号とをもとに、新しい種の選択
を行ないます。
あるマシンでは、random
の結果として
Lispで表現可能な、どの整数が返されることもあります。
あるいは、マシンによっては、
値は、ある最大値より大きくはなく、
またある(負の)最小値より小さくなることもありません。
Go to the first, previous, next, last section, table of contents.