R6RS:翻訳:R6RS:11.7.4.3 Arithmetic operations

R6RS:翻訳:R6RS:11.7.4.3 Arithmetic operations

11.7.4.3 数値演算

[procedure] (= z1 z2 z3 ...)

[procedure] (< x1 x2 x3 ...)

[procedure] (> x1 x2 x3 ...)

[procedure] (<= x1 x2 x3 ...)

[procedure] (>= x1 x2 x3 ...)

これらの手続きは(順に)引き数が、等しい、単調増加している、単調減少している、単調減少していない、単調増加していない場合に #t を返し、それ以外の場合には #f を返す。

(= +inf.0 +inf.0)                   ⇒  #t
(= -inf.0 +inf.0)                   ⇒  #f
(= -inf.0 -inf.0)                   ⇒  #t

無限大や非数でない任意の実数オブジェクト x について次が成り立つ。

(< -inf.0 x +inf.0)                ⇒  #t
(> +inf.0 x -inf.0)                ⇒  #t

任意の数値オブジェクト z について次が成り立つ。

(= +nan.0 z)                       ⇒  #f

任意の実数オブジェクトについて次が成り立つ。

(< +nan.0 x)                       ⇒  #f
(> +nan.0 x)                       ⇒  #f

これらの手続きは推移的でなければならない。

: Lisp 風の言語ではこれらの述語の実装は伝統的に推移的でなかった。

: 不正確な数値オブジェクトをこれらの述語をつかって比較することも可能であるが、その結果は小さな不正確性が結果に影響を与えるため信頼できないかもしれない。このことは特に = と(下の) zero? に当てはまる。

不確かな場合には数値解析家に相談してほしい。

[procedure] (zero? z)

[procedure] (positive? x)

[procedure] (negative? x)

[procedure] (odd? n)

[procedure] (even? n)

[procedure] (finite? x)

[procedure] (infinite? x)

[procedure] (nan? x)

これらの数値述語は数値オブジェクトの特定の性質を検査して #t か #f を返す。 zero? は数値オブジェクトが 0 と = であるか検査し、 positive? は 0 より大きいか検査し、 negative? は 0 より小さいかを検査する。 odd? は奇数であるかどうかを検査し、 even? は偶数であるかどうかを検査し、 finite? は無限大や非数でないか検査し、 infinite? は無限大であるかどうかを検査し、 nan? は非数であるかどうかを検査する。

(zero? +0.0)                          ⇒  #t
(zero? -0.0)                          ⇒  #t
(zero? +nan.0)                        ⇒  #f
(positive? +inf.0)                    ⇒  #t
(negative? -inf.0)                    ⇒  #t
(positive? +nan.0)                    ⇒  #f
(negative? +nan.0)                    ⇒  #f
(finite? +inf.0)                      ⇒  #f
(finite? 5)                           ⇒  #t
(finite? 5.0)                         ⇒  #t
(infinite? 5.0)                       ⇒  #f
(infinite? +inf.0)                    ⇒  #t

: 上の述語と同様に、小さな不正確性が結果に影響を与えるため、結果が信頼できないこともある。

[procedure] (max x1 x2 ...)

[procedure] (min x1 x2 ...)

これらの手続きは引き数のうちの最大値や最小値を返す。

(max 3 4)                                      ⇒  4
(max 3.9 4)                                    ⇒  4.0

非数でない任意の実数オブジェクト x について次が成り立つ。

(max +inf.0 x)                                 ⇒  +inf.0
(min -inf.0 x)                                 ⇒  -inf.0

: 引き数のいずれかが不正確である場合、戻り値もまた不正確になる(不正確さが結果に影響を与えない程度に大きくないと証明できる場合を除く。これは一般の実装系には不可能である)。 min や max が正確性の混在した数値オブジェクトを比較するのに使われ、結果の数値が正確さを損わずに不正確な数値オブジェクトととして表現できない場合、 &implementation-restriction コンディション型の例外が発生することもある。

[procedure] (+ z1 ...)

[procedure] (* z1 ...)

これらの手続きは引き数の和や積を返す。

(+ 3 4)                                        ⇒  7
(+ 3)                                          ⇒  3
(+)                                            ⇒  0
(+ +inf.0 +inf.0)                              ⇒  +inf.0
(+ +inf.0 -inf.0)                              ⇒  +nan.0

(* 4)                                          ⇒  4
(*)                                            ⇒  1
(* 5 +inf.0)                                   ⇒  +inf.0
(* -5 +inf.0)                                  ⇒  -inf.0
(* +inf.0 +inf.0)                              ⇒  +inf.0
(* +inf.0 -inf.0)                              ⇒  -inf.0
(* 0 +inf.0)                                   ⇒  0 or +nan.0
(* 0 +nan.0)                                   ⇒  0 or +nan.0
(* 1.0 0)                                      ⇒  0 or 0.0

無限大や非数でない任意の実数オブジェクト x について次が成り立つ。

(+ +inf.0 x)                                   ⇒  +inf.0
(+ -inf.0 x)                                   ⇒  -inf.0

任意の実数オブジェクト x について次が成り立つ。

(+ +nan.0 x)                                   ⇒  +nan.0

正確な 0 以外の任意の実数オブジェクト x について次が成り立つ。

(* +nan.0 x)                                   ⇒  +nan.0

これらの手続きのいずれかが有理数でない実数と実数でない複素数の混在した引き数に対して適用された場合、 &implementation-restriction コンディション型の例外が発生するか、未規定の数値オブジェクトが返る。

-0.0 を区別する実装系では以下の例と一貫性のある振る舞いを採用するべきである。

(+ 0.0 -0.0)          ⇒ 0.0
(+ -0.0 0.0)          ⇒ 0.0
(+ 0.0 0.0)           ⇒ 0.0
(+ -0.0 -0.0)         ⇒ -0.0

[procedure] (- z)

[procedure] (- z1 z2 z3 ...)

ふたつ以上の引き数を与えた場合、引き数の差を左結合で求める。引き数がひとつの場合には、引き数の加法の逆元を返す。

(- 3 4)                                        ⇒  -1
(- 3 4 5)                                      ⇒  -6
(- 3)                                          ⇒  -3
(- +inf.0 +inf.0)                              ⇒  +nan.0

この手続きを有理数でない実数と実数でない複素数の混在した引き数に適用した場合、 &implementation-restriction コンディション型の例外が発生するか、未規定の数値オブジェクトが返る。

-0.0 を区別する実装系は以下の例と一貫性のある振る舞いをするべきである。

(- 0.0)               ⇒ -0.0
(- -0.0)              ⇒ 0.0
(- 0.0 -0.0)          ⇒ 0.0
(- -0.0 0.0)          ⇒ -0.0
(- 0.0 0.0)           ⇒ 0.0
(- -0.0 -0.0)         ⇒ 0.0

[procedure] (/ z)

[procedure] (/ z1 z2 z3 ...)

引き数がすべて正確である場合、除数はすべて 0 であってはならない。ふたつ以上の引き数を与えた場合、左結合で引き数の商を求める。引き数がひとつの場合、引き数の乗法の逆元を返す。

(/ 3 4 5)                                      ⇒  3/20
(/ 3)                                          ⇒  1/3
(/ 0.0)                                        ⇒  +inf.0
(/ 1.0 0)                                      ⇒  +inf.0
(/ -1 0.0)                                     ⇒  -inf.0
(/ +inf.0)                                     ⇒  0.0
(/ 0 0)                                  &assertion exception
(/ 3 0)                                  &assertion exception
(/ 0 3.5)                                      ⇒  0.0
(/ 0 0.0)                                      ⇒  +nan.0
(/ 0.0 0)                                      ⇒  +nan.0
(/ 0.0 0.0)                                    ⇒  +nan.0

この手続きを有理数でない実数と実数でない複素数の混在した引き数に適用した場合、 &implementation-restriction コンディション型の例外が発生するか、未規定の数値オブジェクトが返る。

[procedure] (abs x)

引き数の絶対値を返す。

(abs -7)                                       ⇒  7
(abs -inf.0)                                   ⇒  +inf.0

[procedure] (div-and-mod x1 x2)

[procedure] (div x1 x2)

[procedure] (mod x1 x2)

[procedure] (div0-and-mod0 x1 x2)

[procedure] (div0 x1 x2)

[procedure] (mod0 x1 x2)

これらの手続きは整数論上の整数の除算の実現であり、 R6RS:翻訳:R6RS:11.7.3.1 Integer division に規定された数学演算に対応する結果を返す。いずれの場合も、 x1 は無限大や非数であってはならず、 x2 は 0 であってはならない。そうでない場合には &assertion コンディション型の例外が発生する。

(div x1 x2)                 ⇒ x1 div x2
(mod x1 x2)                 ⇒ x1 mod x2
(div-and-mod x1 x2)             ⇒ x1 div x2, x1 mod x2
; two return values
(div0 x1 x2)                ⇒ x1 div0 x2
(mod0 x1 x2)                ⇒ x1 mod0 x2
(div0-and-mod0 x1 x2)   
                ⇒ x1 div0 x2, x1 mod0 x2
; two return values

[procedure] (gcd n1 ...)

[procedure] (lcm n1 ...)

引き数の最大公約数と最小公倍数を返す。戻り値は常に非負である。

(gcd 32 -36)                                   ⇒  4
(gcd)                                          ⇒  0
(lcm 32 -36)                                   ⇒  288
(lcm 32.0 -36)                                 ⇒  288.0
(lcm)                                          ⇒  1

[procedure] (numerator q)

[procedure] (denominator q)

引き数の分子や分母を返す。戻り値は引き数が既約分数で表現されているかのように計算される。分母は常に正である。 0 の分母は 1 であると定義されている。

(numerator (/ 6 4))                            ⇒  3
(denominator (/ 6 4))                          ⇒  2
(denominator
  (inexact (/ 6 4)))                           ⇒  2.0

[procedure] (floor x)

[procedure] (ceiling x)

[procedure] (truncate x)

[procedure] (round x)

これらの手続きは無限大や非数でない不正確な引き数に対しては不正確な整数を返し、正確な有理数の引き数に対しては正確な整数オブジェクトを返す。そのような引き数に対して、 floor は x よりも大きくない最大の整数を返す。 ceiling 手続きは x よりも小さくない最小の整数を返す。 truncate 手続きは、絶対値が x よりも大きくない x に最も近い整数オブジェクトを返す。 round 手続きは x に最も近い整数オブジェクトを返す。このとき、 x がふたつの整数の中間を表していた場合には偶数方向に丸められる。

: これらの手続きの引き数のうちひとつが不正確である場合、戻り値も不正確になる。正確な値が必要な場合には、戻り値を exact 手続きに渡すべきである。

無限大や非数は整数オブジェクトではないが、これらの手続きは引き数として無限大が与えられた場合には無限大を返し、非数が与えられた場合には非数を返す。

(floor -4.3)                                   ⇒  -5.0
(ceiling -4.3)                                 ⇒  -4.0
(truncate -4.3)                                ⇒  -4.0
(round -4.3)                                   ⇒  -4.0

(floor 3.5)                                    ⇒  3.0
(ceiling 3.5)                                  ⇒  4.0
(truncate 3.5)                                 ⇒  3.0
(round 3.5)                                    ⇒  4.0

(round 7/2)                                    ⇒  4
(round 7)                                      ⇒  7

(floor +inf.0)                                 ⇒  +inf.0
(ceiling -inf.0)                               ⇒  -inf.0
(round +nan.0)                                 ⇒  +nan.0

[procedure] (rationalize x1 x2)

rationalize 手続きは x1 から x2 以上異ならない最も単純な有理数を表す数値オブジェクトを返す。有理数 r1r2 があるとき、(既約分数で) r1 = p1/q1r2 = p2/q2 のとき、 |p1| ≤ |p2| かつ |q1| ≤ |q2| であれば、 r1 は他の有理数 r2 よりも単純である。したがって、 3/5 は 4/7 よりも単純である。すべての有理数がこの順序で比較可能ではないが(例えば 2/7 と 3/5)、任意の区間に他のすべての有理数よりも単純な有理数がある(2/7 と 3/5 の間にはより単純な 2/5 がある)。 0 = 0/1 が全体で最も単純な有理数であることに注意。

(rationalize (exact .3) 1/10)          
                ⇒ 1/3
(rationalize .3 1/10)                  
                ⇒ #i1/3  ; approximately

(rationalize +inf.0 3)                         ⇒  +inf.0
(rationalize +inf.0 +inf.0)                    ⇒  +nan.0
(rationalize 3 +inf.0)                         ⇒  0.0

最初のふたつの例は不正確な実数オブジェクトが十分な精度を持つ実装系でだけ成り立つ。

[procedure] (exp z)

[procedure] (log z)

[procedure] (log z1 z2)

[procedure] (sin z)

[procedure] (cos z)

[procedure] (tan z)

[procedure] (asin z)

[procedure] (acos z)

[procedure] (atan z)

[procedure] (atan x1 x2)

これらの手続きは超越関数を計算する。 exp 手続きは底 ez の指数を計算する。 log 手続きは単一引き数の場合には z の自然対数(常用対数ではない)を計算し、 (log z1 z2) は底 z2z1 の対数を計算する。 asin、 acos、 atan 手続きはそれぞれ逆正弦、逆余弦、逆正接を計算する。二引き数版の atan は (angle (make-rectangular x2 x1)) を計算する。

元になる数学演算については R6RS:翻訳:R6RS:11.7.3.2 Transcendental functions を参照。これらの手続きは正確な引き数を与えても不正確な戻り値を返すことがある。

(exp +inf.0)                           ⇒ +inf.0
(exp -inf.0)                           ⇒ 0.0
(log +inf.0)                           ⇒ +inf.0
(log 0.0)                              ⇒ -inf.0
(log 0)                          &assertion exception
(log -inf.0)                   
                ⇒ +inf.0+3.141592653589793i
 ; approximately
(atan -inf.0)                  
                ⇒ -1.5707963267948965 ; approximately
(atan +inf.0)                  
                ⇒ 1.5707963267948965 ; approximately
(log -1.0+0.0i)                
                ⇒ 0.0+3.141592653589793i ; approximately
(log -1.0-0.0i)                
                ⇒ 0.0-3.141592653589793i ; approximately
; if -0.0 is distinguished

[procedure] (sqrt z)

z の主要な平方根を返す。有理数 z に対しては、戻り値は 0 以上の実部に非負の虚部を持つ。 R6RS:翻訳:R6RS:11.7.3.2 Transcendental functions に定義されている log を使うと、 (sqrt z) の値は e^(log z/2) で表すことができる。

sqrt 手続きは正確な引き数を渡した場合にも不正確な戻り値を返すことがある。

(sqrt -5)                   
                ⇒  0.0+2.23606797749979i ; approximately
(sqrt +inf.0)                       ⇒  +inf.0
(sqrt -inf.0)                       ⇒  +inf.0i

[procedure] (exact-integer-sqrt k)

exact-integer-sqrt 手続きはふたつの非負の正確な整数 sr を返し、このとき、 k = s^2 + r かつ k < (s + 1)^2 である。

(exact-integer-sqrt 4)         ⇒ 2 0
; two return values
(exact-integer-sqrt 5)         ⇒ 2 1
; two return values

[procedure] (expt z1 z2)

z1z2 乗を返す。 0 でない z1 について、これは e^(z2 log z1) である。 0.0^zz = 0.0 で (real-part z) が正の場合 1.0 である。それ以外の場合、最初の引き数が 0 であると、 &implementation-restriction コンディション型の例外が発生するか、未規定の数値オブジェクトが返る。

正確な実数オブジェクト z1 と正確な整数オブジェクト z2 に対して、 (expt z1 z2) は正確な結果を返さなければならない。それ以外の z1z2 の値すべてについては、 (expt z1 z2) は z1z2 が正確な場合でも不正確な結果を返すこともある。

(expt 5 3)                          ⇒  125
(expt 5 -3)                         ⇒  1/125
(expt 5 0)                          ⇒  1
(expt 0 5)                          ⇒  0
(expt 0 5+.0000312i)                ⇒  0
(expt 0 -5)                         ⇒  unspecified
(expt 0 -5+.0000312i)               ⇒  unspecified
(expt 0 0)                          ⇒  1
(expt 0.0 0.0)                      ⇒  1.0

[procedure] (make-rectangular x1 x2)

[procedure] (make-polar x3 x4)

[procedure] (real-part z)

[procedure] (imag-part z)

[procedure] (magnitude z)

[procedure] (angle z)

a1a2a3a4 が実数である場合、 c は次の条件を満たす複素数である。

[image]

x1x2x3x4 がそれぞれ a1a2a3a4 を表す数値オブジェクトである場合、 (make-rectangular x1 x2) と (make-polar x3 x4) は c を返す。

(make-rectangular 1.1 2.2) 
                ⇒ 1.1+2.2i ; approximately
(make-polar 1.1 2.2) 
                ⇒ 1.1@2.2 ; approximately

逆に、 -π ≤ a4 ≤ π であり、 zc を表す数値オブジェクトである場合、 (real-part z) は a1 を返し、 (imag-part z) は a2 を返し、 (magnitude z) は a3 を返し、 (angle z) は a4 を返す。

(real-part 1.1+2.2i)                      ⇒ 1.1 ; approximately
(imag-part 1.1+2.2i)                      ⇒ 2.2 ; approximately
(magnitude 1.1@2.2)                      ⇒ 1.1 ; approximately
(angle 1.1@2.2)                          ⇒ 2.2 ; approximately

(angle -1.0)         
                ⇒ 3.141592653589793 ; approximately
(angle -1.0+0.0i)    
                ⇒ 3.141592653589793 ; approximately
(angle -1.0-0.0i)    
                ⇒ -3.141592653589793 ; approximately
; if -0.0 is distinguished
(angle +inf.0)               ⇒ 0.0
(angle -inf.0)       
                ⇒ 3.141592653589793 ; approximately

さらに x1x2 がいずれかが無限大であるような場合、次が成り立つ。

(make-rectangular x1 x2)         ⇒ z
(magnitude z)                      ⇒ +inf.0

make-polar、 magnitude、 angle 手続きは正確な引き数を与えらえた場合でも不正確な戻り値を返すこともある。

(angle -1)                    
                ⇒ 3.141592653589793 ; approximately

Last modified : 2012/02/07 07:45:11 UTC