Next: , Previous: Numeric Conversions, Up: Numbers


3.6 算術演算

Emacs Lispには、伝統的な四則演算、加算、減算、乗算、除算があります。 除算関数を補う、余りと剰余の関数もあります。 Lispの伝統でもあり、また、多用するので、1を加算したり減算する関数もあります。

これらの関数は、%を除いて、引数が1つでも浮動小数点数であると、 浮動小数点数を返します。

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: + &rest numbers-or-markers

この関数は、引数をすべて加算する。 引数を指定しないと+は0を返す。

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

関数-は、2つの役割、つまり、符号反転と減算を果たす。 -に1つの引数を指定すると、 その値は、引数の符号を反転したものである。 複数個の引数を指定すると、-は、 number-or-markerからmore-numbers-or-markersの1つ1つを減算する。 引数を指定しないと結果は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を指定してあると、 dividenddivisorsの1つ1つで除す。 各引数は数かマーカである。

すべての引数が整数である場合、結果も整数となる。 つまり、結果は切り捨てになる。 ほとんどの計算機では各除算の結果は0に向けて切り捨てになるが、 負の引数を別の方法で丸める計算機もある。 これは、Lisp関数/をC言語の除算演算子で実装しているからであり、 C言語の除算演算子では計算機依存に丸めることを許しているからである。 実用上、すべての既知の計算機は標準的な方法で丸める。

整数を0で除算すると、エラーarith-errorを通知する。 (see Errors。) 浮動小数点数を0で除算すると、IEEE浮動小数点数を使う計算機では、 無限大かNaNを返す。 さもなければエラーarith-errorを通知する。

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

原理的には、(/ -17 6)が-3になる計算機もある。

— Function: % dividend divisor

この関数は、dividenddivisorで除したあとの整数の余りを返す。 引数は整数かマーカである必要がある。

負の引数では、余りは原理的に計算機依存である。 実用上、すべての既知の計算機は同じようにふるまう。

divisorが0であるとarith-errorになる。

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

2つの任意の整数dividenddivisorにおいて、

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

は、つねにdividendに等しい。

— Function: mod dividend divisor

この関数は、dividenddivisorによる剰余を返す。 いいかえれば、dividenddivisorで除した余りを返す。 ただし、その符号は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

2つの任意の整数dividenddivisorにおいて、

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

は、つねにdividendに等しい。 ただし、どちらかの引数が浮動小数点数の場合には、 丸め誤差の範囲内で等しい。 floorについては、Numeric Conversionsを参照。