次: Rounding Operations, 前: Numeric Conversions, 上: Numbers
Emacs Lispには、伝統的な四則演算、加算、減算、乗算、除算があります。 除算関数を補う、余りと剰余の関数もあります。 Lispの伝統でもあり、また、多用するので、1を加算したり減算する関数もあります。
これらの関数は、%
を除いて、引数が1つでも浮動小数点数であると、
浮動小数点数を返します。
Emacs Lispでは、算術関数は桁溢れ(オーバフロー)を検査しないことに
注意してください。
つまり、読者の計算機に依存しますが、
(1+ 134217727)
を評価すると−134217728になる場合もあります。
この関数は、number-or-marker足す1を返す。
(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
関数
-
は、2つの役割、つまり、符号反転と減算を果たす。-
に1つの引数を指定すると、 その値は、引数の符号を反転したものである。 複数個の引数を指定すると、-
は、 number-or-markerからmore-numbers-or-markersの1つ1つを減算する。 引数を指定しないと結果は0である。(- 10 1 2 3 4) => 0 (- 10) => -10 (-) => 0
この関数は、引数をすべて掛け合わせた乗算結果を返す。 引数を指定しないと
*
は1を返す。(*) => 1 (* 1) => 1 (* 1 2 3 4) => 24
この関数は、dividendをdivisorで除し商を返す。 追加の引数divisorsを指定してあると、 dividendをdivisorsの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になる計算機もある。
この関数は、dividendをdivisorで除したあとの整数の余りを返す。 引数は整数かマーカである必要がある。
負の引数では、余りは原理的に計算機依存である。 実用上、すべての既知の計算機は同じようにふるまう。
divisorが0であると
arith-error
になる。(% 9 4) => 1 (% -9 4) => -1 (% 9 -4) => 1 (% -9 -4) => -12つの任意の整数dividendとdivisorにおいて、
(+ (% dividend divisor) (* (/ dividend divisor) divisor))は、つねにdividendに等しい。
この関数は、dividendのdivisorによる剰余を返す。 いいかえれば、dividendをdivisorで除した余りを返す。 ただし、その符号は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) => .52つの任意の整数dividendとdivisorにおいて、
(+ (mod dividend divisor) (* (floor dividend divisor) divisor))は、つねにdividendに等しい。 ただし、どちらかの引数が浮動小数点数の場合には、 丸め誤差の範囲内で等しい。
floor
については、Numeric Conversionsを参照。