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

3. 数値

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が浮動小数点をサポートしていないこともあるかもしれません。


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

3.1 整数の基本事項

整数値の範囲は、 マシンに依存します。 最低でも、 範囲は-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とする理由です。 引数の値がマーカのとき、 マーカの位置の値が用いられ、 マーカのバッファは無視されます。


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

3.2 浮動小数点の基本事項

マクロの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進指数部をとりだすことができます (整数の対数を見積もることができます)。

Function: logb number

この関数は、 numberの2進指数部を返します。 正確に書くと、 この値は、2を底にしたnumberの対数を整数値に切り捨てたものです。


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

3.3 数値型にたいする述語

この節で説明する関数は、 引数が数であるか、 またそれがどんな種類の数であるかを調べるのに使います。 関数integerpfloatpには、 引数としてどんな型のLispオブジェクトでも与えることができます (そうでなければ述語というものはあまり使えないでしょう)。 しかし、zerop述語には、 引数として数だけが許されます。マーカに対する述語の、 integer-or-marker-pnumber-or-marker-pを参照してください。

Function: floatp object

この述語は、引数が浮動小数点数であるか否か調べ、 もしそうならtを、 そうでなければnilを返します。

floatpはバージョン18やそれ以前のEmacsにはありません。

Function: integerp object

この述語は、 引数が整数であるか否かを調べ、 もしそうならtを返し、 そうでなければnilを返します。

Function: numberp object

この述語は、 引数が数(整数か浮動小数点かどちらか)であるか否かを調べ、 もしそうならtを、 そうでなければnilを返します。

Function: wholenump object

wholenump述語("whole-number-p" という句から名づけられました)は、 引数が非負の整数であるか否かを調べ、 もしそうならtを、 そうでなければnilを返します。 0は非負とみなします。

natnumpwholenumpの古い別称です。

Function: zerop number

この述語は、 引数が0であるか否かを調べ、 もしそうならtを、 そうでなければnilを返します。 引数は数でなければなりません。

次の二つの形式は等価です。(zerop x)(= x 0)


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

3.4 数値の比較

数をその数値としての等価性について調べるには、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では整数値の範囲を制限しているため、 与えられたすべての値にたいする整数オブジェクトが一意に定まります。

Function: = number-or-marker1 number-or-marker2

この関数は、引数が同じ数値であるか否かを調べ、 同じ数値である場合 tを返し、 そうでない場合nilを返します。

Function: /= number-or-marker1 number-or-marker2

この関数は、 引数が同じ数値であるか否かを調べ、 同じ数値でない場合 tを返し、 同じ数値である場合nilを返します。

Function: < number-or-marker1 number-or-marker2

この関数は、最初の引数が2番目の引数より厳密に小さいか否かを調べます。 小さい場合tを返し、そうでない場合nilを返します。

Function: <= number-or-marker1 number-or-marker2

この関数は、 最初の引数が2番目の引数より小さいか等しい かを調べます。 小さいか等しい場合tを返し、 そうでない場合nilを返します。

Function: > number-or-marker1 number-or-marker2

この関数は、最初の引数が2番目の引数より厳密に大きいか否かを調べます。 大きい場合tを返し、 そうでない場合nil を返します。

Function: >= number-or-marker1 number-or-marker2

この関数は、最初の引数が2番目の引数より大きいか等しいかを調べます。 大きいか等しい場合tを返し、 そうでない場合nilを返します。

Function: max number-or-marker &rest numbers-or-markers

この関数は、引数の最大値を返します。

 
(max 20)
     ⇒ 20
(max 1 2.5)
     ⇒ 2.5
(max 1 3 2.5)
     ⇒ 3
Function: min number-or-marker &rest numbers-or-markers

この関数は、引数の最小値を返します。

 
(min -4 1)
     ⇒ -4

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

3.5 数の変換

整数を浮動小数点に変換するには、関数floatを使います。

Function: float number

これは、浮動小数点に変換したnumberを返します。 もし、numberがすでに浮動小数点数なら、 floatは変更せずに返します。

浮動小数点数を整数に変換する四つの関数があります。 丸め方が違っています。 整数の引数を与えてこれらの関数を呼んでもかまいません。 そのときは引数を変更しないで返します。

Function: truncate number

これは、numberを0の方向へ丸めた整数に変換し、返します。

Function: floor number &optional divisor

これは、numberを小さくなる(負の無限大の)方向へ丸めた整数に変換し、 返します。

divisorを指定すると、numberdivisorで割ってから そのfloorをとります。 これは、modにたいする除算に相当します。 divisorが0ならarith-errorを発生します。

Function: ceiling number

これは、numberを大きくなる(正の無限大の)方向へ丸めた整数に変換し、 返します。

Function: round number

これは、numberを一番近い整数へ丸めて整数に変換し、返します。 となりあった整数の中間の値を丸めようとすると、マシンに依存して、 0に近い整数か、偶数の方向へと丸めます。


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

3.6 算術演算

Emacs Lispは伝統的な四則演算、つまり加減乗除を提供します。 除算に加えて、剰余と法の関数も用意してあります。 Lisp では伝統的であり、またよく使われるため、 1を加減算する関数もあります。

%以外の関数は、 引数の中に浮動小数点値のものがあると浮動小数点値を返します。

重要なことですが、 GNU Emacs Lispの算術関数では桁あふれのチェックは行ないません。 ハードウェアによっては、 (1+ 134217727)は、-134217728と評価されるでしょう。

Function: 1+ number-or-marker

この関数は、number-or-marker足す1を返します。 たとえば、

 
(setq foo 4)
     ⇒ 4
(1+ foo)
     ⇒ 5

この関数は、Cの++演算子とは違います。 変数をインクリメントさせません。 和を計算するだけです。 したがって、その後でもこうなります。

 
foo
     ⇒ 4

もし、変数をインクリメントさせたいなら、次のようにsetqを使わなければなりません。

 
(setq foo (1+ foo))
     ⇒ 5
Function: 1- number-or-marker

この関数は、number-or-marker引く1を返します。

Function: abs number

これは、numberの絶対値を返します。

Function: + &rest numbers-or-markers

この関数は、引数を足しあわせます。 引数が与えられない場合、+は、0を返します。

 
(+)
     ⇒ 0
(+ 1)
     ⇒ 1
(+ 1 2 3 4)
     ⇒ 10
Function: - &optional number-or-marker &rest other-numbers-or-markers

関数-には、二つの目的があります。 反数(はんすう)と減算です。 -に単一の引数を与えたとき、 値は引数の反数です。 複数の引数が存在する場合、 number-or-markerから全部のother-numbers-or-markersを 次々に引きます。 引数が存在しない場合、結果は0になります。

 
(- 10 1 2 3 4)
     ⇒ 0
(- 10)
     ⇒ -10
(-)
     ⇒ 0
Function: * &rest numbers-or-markers

この関数は、引数を掛けあわせて積を返します。 引数が与えられない場合、*は、1を返します。

 
(*)
     ⇒ 1
(* 1)
     ⇒ 1
(* 1 2 3 4)
     ⇒ 24
Function: / dividend divisor &rest divisors

この関数は、 dividenddivisor(除数)で割り、 商を返します。 もし省略可能な引数divisorsが存在する場合は、 dividendを各除数で次々に割っていきます。 各引数は数でもマーカでもかまいません。

全部の引数が整数なら、 結果も整数になります。 つまり結果は丸められます。 ほとんどのマシンでは、 すべての除算の後、 0の方向へ丸められます。 しかし、あるマシンでは負の引数のとき異なる丸め方をすることがありえます。 これは、Lisp関数/が、 マシン依存の丸め方を許すCの除算演算子を使って 実装されているためです。 実際にはよく知られたマシンでは標準的な方法で丸められます。

0で割るとarith-errorを発生します。(See section エラー。)

 
(/ 6 2)
     ⇒ 3
(/ 5 2)
     ⇒ 2
(/ 25 3 2)
     ⇒ 4
(/ -17 6)
     ⇒ -2

原理的には(/ -17 6)の結果は、 あるマシンでは-3 になりえます。

Function: % dividend divisor

この関数は、 dividenddivisorで割ったあとの整数剰余 (integer remainder) を返します。 引数は、整数かマーカでなければなりません。

負の引数については、 原理的には商がマシン依存のため、 余りもマシン依存になります。 しかし実際は、 すべてのよく使われるマシンでは同じように振る舞います。

divisorが0ならarith-errorになります。

 
(% 9 4)
     ⇒ 1
(% -9 4)
     ⇒ -1
(% 9 -4)
     ⇒ 1
(% -9 -4)
     ⇒ -1

任意の二つの整数dividenddivisorについて、

 
(+ (% dividend divisor)
   (* (/ dividend divisor) divisor))

は、常にdividendと等しいです。

Function: mod dividend divisor

この関数は、divisorを法(ほう)としたdividendの値を返します。 いいかえると、 divisorと同じ符号にしたdividendの、 divisorによる除算の剰余です。 引数は数かマーカでなければなりません。

%とは異なり、 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

任意の二つの数dividenddivisorについて、 以下の

 
(+ (mod dividend divisor)
   (* (floor dividend divisor) divisor))

は、 引数が浮動小数点の場合の丸め誤差の範囲で、 常にdividendに等しいです。 floorについては、数の変換を参照してください。


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

3.7 丸め演算

関数ffloorfceilingfroundftruncateは、浮動小数点の引数をとり、 整数に最も近い浮動小数点値の結果を返します。 ffloorは最も近い小さな整数を返します。 fceilingは最も近い大きな整数です。 ftruncateは0の方向にむかって最も近い整数です。 froundは最も近い整数です。

Function: ffloor float

この関数は、 floatの次に小さい整数へ丸めた値を、 浮動小数点数として返します。

Function: fceiling float

この関数は、 floatの次に大きい整数に丸めた値を、 浮動小数点数として返します。

Function: ftruncate float

この関数は、 floatを0の方向へ丸めた整数に変換した値を、 浮動小数点数として返します。

Function: fround float

この関数は、 floatに一番近い整数へ丸めた値を、 浮動小数点数として返します。


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

3.8 整数にたいするビットごとの演算

計算機内部では、整数は、2進数、 すなわち(0と1の数字になった)ビット(bit)・シーケンスで表現され、 ビットごとの演算は、このようなシーケンスの個々のビットに作用します。 たとえば、桁送り(shifting)は、 ビット・シーケンス全体を左右に一つ、あるいはもっと、移動させて、 同じパターンを「移動した」のに等しいものを作りだします。

Emacs Lispのビット演算は、整数に対してのみ適用します。

Function: lsh integer1 count

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         
Function: ash integer1 count

ash (arithmetic shift) は、 integer1中のビットを左(countが負の場合は右)に、 countだけ桁送りします。

ashは、integer1countが両方とも 負である場合をのぞき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
Function: logand &rest ints-or-markers

この関数は、引数の「論理積」を返します。 結果の第nビットは、 全ての引数で第nビットがセットされている場合にのみ、セットされます (「セット」とは、ビットの値が0でなく1にすることです)。

たとえば、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
Function: logior &rest ints-or-markers

この関数は、引数の「論理和」を返します。 結果の第nビットは、 少なくとも一つの引数で第nビットがセットされている場合に のみセットされます。 引数が存在しない場合、 結果はこの演算の単位元である0になります。 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
Function: logxor &rest ints-or-markers

この関数は、引数の「排他的論理和」を返します。 結果の第nビットは、 奇数個の引数で第nビットがセットされている場合にのみセット されます。引数が存在しない場合、 結果はこの演算の単位元である0になります。 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
Function: lognot integer

この関数は、 引数の論理的補数(logical complement)を返します。 結果の第nビットは、 integerの第nビット目が0である場合にのみセットされま す。 逆もまた同様です。

 
(lognot 5)             
     ⇒ -6
;;  5  =  0000  0000 0000  0000 0000  0000 0101
;; は
;; -6  =  1111  1111 1111  1111 1111  1111 1010
;; になる

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

3.9 標準的な数学関数

以下の数学関数は、浮動小数点をサポートしている場合に有効です。 浮動小数点数だけでなく、整数を引数に与えることができます。

Function: sin arg
Function: cos arg
Function: tan arg

これらは通常の三角関数で、 引数の単位はラジアンです。

Function: asin arg

(asin arg)の値は、 正弦がargとなるような-π/2から π/2までの(境界を含む)数です。 しかし、もしargが [-1, 1] の範囲外なら、結果はNaNです。

Function: acos arg

(acos arg)の値は、 余弦がargとなるような0からπまでの(境界を含む)数です。 しかし、もしargが [-1, 1] の範囲外なら、結果はNaNです。

Function: atan arg

(atan arg)の値は、正接がargとなるような-π/2 からπ/2までの(境界を含まない)数です。

Function: exp arg

これは指数関数です。 earg乗を返します。 eは数学の基本定数で自然対数の底ともいいます。

Function: log arg &optional base

この関数は、baseを底にしたargの対数を返します。 baseを指定しなければ底としてeを用います。 argが負なら、結果はNaNです。

Function: log10 arg

この関数は、10を底にした対数を返します。 argが負なら、結果はNaNです。 少なくとも近似的には (log10 x)(log x 10) です。

Function: expt x y

この関数は、xy乗を返します。 もし、両方の引数が整数で、yが正ならば、結果は整数です。 この場合、表現可能な整数値の範囲に切り捨てられます。

Function: sqrt arg

これはargの平方根を返します。 argが負なら結果はNaNです。


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

3.10 乱数

計算機プログラムは決定性があり、 真の乱数を発生できません。 ほとんどの目的のためには、疑似乱数(pseudo-random number)で十分です。 疑似乱数列は、決定性のある仕方で生成されます。 そうした乱数列は真の乱数ではありませんが、乱数列に類似した特性をもっています。 たとえば、 すべてのとり得る値は、疑似乱数列中で等しい頻度で発生します。

Emacs は、「種」(seed)となる数から疑似乱数を生成します。 与えられた種から始めて、 random関数は、常に同じ数列を生成します。 Emacsは常に同一の種値から始めるので、 randomの返す数の列は、 実はEmacsを起動するたびに同じものになります! たとえば、あるオペレーティング・システムでは、 Emacsを起動した後(random)を呼び出すと、常に-1457731を返し、 もう一度呼び出すと-7692030を返します。 この復元性はデバッグを行なう際、役立ちます。

真に予見不能な乱数群を必要とする場合は、 (random t)を実行します。 これは、現在の時刻とEmacsのプロセスID番号とをもとに 新しい種の選択を行ないます。

Function: random &optional limit

この関数は、 整数の疑似乱数(pseudo-random integer)を返します。 繰り返して呼ぶと、疑似乱数の列を返します。

もし limitが正整数なら、 値は非負かつlimit未満になります。

limittなら、 現在の時刻とEmacsのプロセスID番号とをもとに、新しい種の選択 を行ないます。

あるマシンでは、randomの結果として Lispで表現可能な、どの整数が返されることもあります。 あるいは、マシンによっては、 値は、ある最大値より大きくはなく、 またある(負の)最小値より小さくなることもありません。


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

This document was generated by Yasutaka SHINDOH on September, 29 2006 using texi2html 1.76.