この章では #Script で行われる数値計算処理の手順を定義する。
原子整数型の値に対して数学的な意味での整数と同じように加算、減算、乗算、絶対値、反数 (加法における逆元)、および大小の比較を定義する。
二つの原始整数型の値 a, b に対して、b ≠ 0 のとき、a を b で割った整数商を次のように定義する:
注意: この整数商の定義は、\
演算子による商演算では用いられていない。
二つの原始整数型の値 a, b について、b ≥ 0 のとき、a の b 乗を求める冪演算は次のように定義する:
原始整数型の値に対して、二進法表記におけるビットごとの論理積、包括的論理和、 排他的論理和、ビットシフトを一般的な計算機科学での定義と同じように定義する。 ただし、負数は 2 の補数によって表されるものとし、無限個の上位ビット '1' を持つものとする。
原始制限実数型の値に対して、数学的な意味での実数と同じように加算、減算、乗算、除算、絶対値、 反数 (加法における逆元)、大きさの比較を定義する。 これらの演算の結果もまた原始制限実数型の値となる。
原始実数型の値に対して、数学的な意味での実数と同じように加算、減算、乗算、除算、絶対値、 反数 (加法における逆元)、大きさの比較を定義する。これらの演算の結果は、 大きさの比較を除いて、元の値の精度にかかわらず数学的に正確な実数であり、 原始実数型の値として表せなくともよい。
実数または原始実数型の値 a, b について、b ≠ 0 のとき、a を b で割った整数商を次のように定義する:
注意: この整数商の定義は、\
演算子による商演算では用いられていない。
原始整数型および原始実数型によって表せる値の範囲は無制限であるが、
現実に存在する計算機の処理能力は有限であり、その限界を超えてスクリプトを
実行し続けることは不可能である。
スクリプトを実行する実行環境は、計算機の性能の限界その他の原因のために
原始型数値の演算や処理を完了することができない場合 (オーバーフローエラー)、スクリプトの実行を中止するか、
あるいは演算や処理の結果として新しい
OverflowError
のインスタンスを投げてもよい。
Number オブジェクトスクリプトで扱われる数値は、初期の Number の特殊なインスタンスによって表される。
このような特殊なインスタンスは、Number オブジェクトと呼ぶ。
オブジェクト O が Number オブジェクトであるとは、O が以下の条件のいづれかを満たすことである:
Real オブジェクトである。Complex オブジェクトである。Infinity オブジェクトである。NaN オブジェクトである。後述の定義により、Number オブジェクトが表す値は不変となる。
Real オブジェクトと Complex
オブジェクトを合わせて有限数オブジェクトといい、Infinity
オブジェクトと NaN オブジェクトを合わせて非有限数オブジェクトという。
Real オブジェクトオブジェクト O が Real
オブジェクトであるとは、O が Integer
オブジェクト、Rational オブジェクトまたは Float
オブジェクトであることである。Real オブジェクトは、実数を表す。
Integer オブジェクトオブジェクト O が Integer オブジェクトであるとは、O
が次の条件を全て満たすことである:
Integer のインスタンスであるか、初期の
Integer.prototype と同じオブジェクトである。$isImmutable という名前の内部メンバを持ち、
その値は初期の Boolean.true
である。value という名前の内部メンバを持ち、
その値は原子整数型の値である。Integer オブジェクトは、その value
内部メンバの値に等しい整数を表している。
Rational オブジェクトオブジェクト O が Rational オブジェクトであるとは、O
が次の条件を全て満たすことである:
Rational のインスタンスであるか、初期の
Rational.prototype と同じオブジェクトである。$isImmutable という名前の内部メンバを持ち、
その値は初期の Boolean.true
である。nu および de という名前の不変の
プロパティを持ち、その値はそれぞれ Integer オブジェクトである。
Rational オブジェクトは、有理数を表している。nu
プロパティの表す整数がその分子を、de
プロパティの表す整数がその分母を表す。
この値は既約分数であり、分母は常に正でなければならない。
Float オブジェクトオブジェクト O が Float オブジェクトであるとは、O
が次の条件を全て満たすことである:
Float のインスタンスであるか、初期の
Float.prototype と同じオブジェクトである。$isImmutable という名前の内部メンバを持ち、
その値は初期の Boolean.true
である。value という名前の内部メンバを持ち、
その値は原子実数型の値である。absolutePrecision という名前の内部メンバを
持ち、その値は原子制限実数型の値である。Float オブジェクトは、その value
内部メンバの値に等しい実数を表している。また absolutePrecision
内部メンバの値は、Float オブジェクトが表す実数の精度を表している。
(Float オブジェクトの精度も参照)
Complex オブジェクトオブジェクト O が Complex オブジェクトであるとは、O
が次の条件を全て満たすことである:
Complex のインスタンスであるか、初期の
Complex.prototype と同じオブジェクトである。$isImmutable という名前の内部メンバを持ち、
その値は初期の Boolean.true
である。re および im という名前の不変の
プロパティを持ち、その値はそれぞれ Real オブジェクトである。
Complex オブジェクトは、複素数を表している。re
プロパティの表す実数がその実部を、im
プロパティの表す実数がその虚部を表す。
Infinity オブジェクトオブジェクト O が Infinity オブジェクトであるとは、O
が次の条件を全て満たすことである:
Infinity のインスタンスであるか、初期の
Infinity.prototype と同じオブジェクトである。$isImmutable という名前の内部メンバを持ち、
その値は初期の Boolean.true
である。sign という名前の不変のプロパティを持つ。
その値は次のいづれかである:
Integer オブジェクトInteger オブジェクトNaN オブジェクトInfinity オブジェクトは、無限大を表している。sign
プロパティの値が整数 1 を表す Integer
オブジェクトならば正の無限大を、整数 −1 を表す Integer
オブジェクトならば負の無限大を、NaN
オブジェクトならば複素無限大 (符号が定まらない無限大) を表す。
NaN オブジェクトオブジェクト O が NaN オブジェクトであるとは、O
が次の条件を全て満たすことである:
NaN のインスタンスであるか、初期の
NaN.prototype と同じオブジェクトである。$isImmutable という名前の内部メンバを持ち、
その値は初期の Boolean.true
である。NaN オブジェクトは、計算結果が一つの通常の数値として
表せないことを示す特殊なオブジェクトである。
Float オブジェクトの精度Float
オブジェクトは、値そのものとは別に、精度の情報を持つ。Float
オブジェクトに対する計算結果の桁数は、元の値の精度で決まる。
精度には、絶対精度と相対精度がある。ある Float
オブジェクトが表す実数 x について、
その真の値との誤差の絶対値が多くとも d であると見積もられるとき、
x に対する絶対精度は −log10(2 d)
である。また、さらに x が 0 でないとき、x に対する相対精度は −log10(2 d / |x|) である。
ただし、d = 0 のとき、x に対する絶対精度は無限大であり、
またさらに x が 0 でないとき、x
に対する相対精度も無限大である。x が 0
のときは、相対精度は d にかかわらず未定義である。
従って、0 でない実数 x に対して、絶対精度 a と相対精度 r との関係は以下のようになる:
実数に関する計算結果が Float オブジェクトとして表されるとき、
その value 内部メンバの値 v、および absolutePrecision 内部メンバの値 a
は原則として以下の規則により決定する:
Float オブジェクトとなる場合の値の特例一つの演算や計算が複数の別の演算や計算の組合せによって定義されていて、
かつその結果が Float オブジェクトとなるとき、
複数の演算・計算を個別に行うかわりに演算・計算を一度にまとめて行っても良い。
これは、この仕様書における演算・計算の定義が厳密に一致する場合でも、
実行時に異なる結果が得られることを許容するものである。
例えばある実行環境において、原始実数型の取りうる値として十進有限小数のみが
サポートされている場合、値 3.0 に対する逆数演算の結果は有限小数でないため、
結果の精度は無限大にはなりえない。従って式 0.3x * /3.0x
の結果の精度も、無限大とはならない。しかしこのような実行環境であっても、
除算を逆数演算を使わずに直接計算するように実装していれば、式
0.3x / 3.0x によって有限小数 0.1
を表す精度が無限大の結果を得ることができるかもしれない。
有限数オブジェクトに関する値の変換を以下のように定める。
任意の有限数オブジェクトについて、 変換前と変換後の種類が等しい恒等変換が存在する。 恒等変換では、変換の結果は変換前の値そのものである。
有限数オブジェクトに関する値の拡大変換を次のように定める。
Integer から
Rational への拡大変換Integer オブジェクト I から Rational
オブジェクトへの拡大変換の結果は、以下の条件を満たす Rational
オブジェクトである:
nu
プロパティの値は I と同じ整数を表す Integer
オブジェクトである。(もちろん I そのものであっても良い)de
プロパティの値は整数 1 を表す Integer オブジェクトである。Integer から
Float への拡大変換Integer オブジェクトから Float
オブジェクトへの拡大変換の結果は、元の Integer オブジェクトが
表す整数に等しい実数を表す Float オブジェクトであり、
その絶対精度は無限大である。
Rational から
Float への拡大変換Rational オブジェクト R から Float
オブジェクト F への拡大変換は、以下のように行う:
de
プロパティの値が表す整数が 1 ならば、R の nu プロパティの値を Integer から Float に変換し、その結果を Rational から Float への変換結果 F とする。Float オブジェクトを変換結果 F とする。
(この Float オブジェクトの各内部メンバの値に関する制約は、Float オブジェクトの精度の規定の通りである。
この拡大変換に関して結果の精度が指定されている場合は、
F の精度はその指定された精度を反映する。)Real から
Complex への拡大変換Real オブジェクト R から Complex
オブジェクトへの拡大変換の結果は、以下の条件を満たす Complex
オブジェクトである:
有限数オブジェクトに関する値の縮小変換を次のように定める。
Rational から
Integer への縮小変換Rational オブジェクト R から Integer
オブジェクト I への縮小変換は、以下のように行う:
nu
プロパティの値が表す整数を n とし、R の
de
プロパティの値が表す整数を d とする。Integer オブジェクトを変換結果
I とする。Float から
Integer への縮小変換Float オブジェクト F から Integer
オブジェクト I への縮小変換は、以下のように行う:
Integer
オブジェクトを変換結果 I とする。Float から
Rational への縮小変換Float オブジェクト F から Rational
オブジェクト R への縮小変換は、以下のように行う:
Rational
オブジェクトを変換結果 R とする。Float オブジェクトを改めて
F とする。Integer に縮小変換し、その結果を
q とする。Float オブジェクトとなるはずである。)Rational に拡大変換したものを変換結果
R とする。Float オブジェクトであるはずである。s を Rational に縮小変換し、その結果を t
とする。Rational オブジェクトとなるはずなので、
それを変換結果 R とする。Complex から
Real への縮小変換Complex オブジェクト C から Real
オブジェクトへの縮小変換の結果は、C の re プロパティの値である。
Number オブジェクトに対する演算は、Number
オブジェクトのメソッドによって行う。
例えば、式
1 + 2 は式 (1).$add[2] と等価であって、これは 1 を表す
Integer オブジェクトの $add メソッドを、2 を表す
Integer オブジェクトを引数として、関数として呼出すことを表している。
$add メソッドは、関数として呼出されると渡された @this
値と引数とを足し合わせてその結果を返す。
このようなメソッドが実際にどのように定義されるかについて、実行環境は
ある程度の選択の余地がある。$add メソッドは、Integer
オブジェクト自身のメンバであるかもしれないし、もしくは初期の
Integer.prototype のメンバであるかもしれないし、あるいは
Integer オブジェクト自身が持つ $get$$add
ゲッターにより返されるオブジェクトであっても良い。
演算のために使われるメソッドが満たすべき条件は以下の通り:
Number オブジェクトは、そのオブジェクトの種類に対して
定義されている演算を行うためのメソッドを持たなければならない。
ただし、初期の Number.prototype や初期の Integer.prototype などのプロパティが
スクリプトの実行によって変更された場合は、この限りではない。Integer オブジェクトのプロパティとして提供される
演算のためのメソッドは、関数として呼び出されたときに @this 値が
Integer オブジェクトでなければ、エラーとしても良い。
エラーとする場合、新しい TypeError
のインスタンスを投げなければならない。
他の型の数値オブジェクトについても同様とする。arity プロパティの初期値は、0 を表す Integer
オブジェクトでなければならない。二項演算のためのメソッドの
arity プロパティの初期値は、1 を表す Integer
オブジェクトでなければならない。以下、Float オブジェクト f に対して、
ap(f) はその絶対精度を、rp(f)
はその相対精度を表すものとする。
非有限数オブジェクトに関する演算結果を定義する表において、 次の省略記法を使用する:
| 省略記法 | 意味 |
|---|---|
| 任意 | Number オブジェクト |
| +∞ | 正の無限大を表す Infinity オブジェクト |
| −∞ | 負の無限大を表す Infinity オブジェクト |
| ∞ | 複素無限大を表す Infinity オブジェクト |
| NaN | NaN オブジェクト |
| 有限数 | 有限数オブジェクト |
| 零 Complex | 実部と虚部が共に実数の比較において
0 と等しい Complex オブジェクト |
| 非零 Complex | 零 Complex ではない Complex オブジェクト |
| Real | Real オブジェクト |
| 零 Real | 実数の比較において 0 と等しい
Real オブジェクト |
| 正 Real | 実数の比較において 0 より大きい
Real オブジェクト |
| 負 Real | 実数の比較において 0 より小さい
Real オブジェクト |
Float オブジェクトに関する演算演算結果が Float オブジェクトとなるとき、そのオブジェクトの
value および absolutePrecision
内部メンバの具体的な値は別項で定める通りとする (→Float オブジェクトの精度)。
$plus恒等演算 $plus は前置単項演算子 + に対応する。
任意の Number オブジェクトに対する恒等演算の結果は、
そのオブジェクトそのものである。
$add加算 $add は二項演算子 + に対応する。
左辺値または右辺値が非有限数オブジェクトであるときの加算結果は下表の通り:
| 左辺値 | 右辺値 | 結果 |
|---|---|---|
| NaN | 任意 | NaN |
| 任意 | NaN | NaN |
| ∞ | ∞/+∞/−∞ | NaN |
| ∞/+∞/−∞ | ∞ | NaN |
| +∞ | +∞ | +∞ |
| −∞ | −∞ | −∞ |
| +∞ | −∞ | NaN |
| −∞ | +∞ | NaN |
| ∞/+∞/−∞ | Complex | ∞ |
| ∞ | Real | ∞ |
| +∞ | Real | +∞ |
| −∞ | Real | −∞ |
| Complex | ∞/+∞/−∞ | ∞ |
| Real | ∞ | ∞ |
| Real | +∞ | +∞ |
| Real | −∞ | −∞ |
左辺値と右辺値が共に Integer オブジェクトのときの加算結果は、
左辺値の表す値を v、右辺値の表す値を w として、整数
v + w の値を表す Integer
オブジェクトである。
左辺値 a と右辺値 b が共に Rational
オブジェクトのときの加算結果は、Rational[a.nu * b.de + a.de * b.nu,
a.de * b.de] の結果に等しい。ただし、結果の Rational オブジェクトの表す有理数の分母が 1 ならば、代わりに
その有理数の分子の値を表す Integer
オブジェクトを結果としてもよい。
左辺値と右辺値の片方が Integer オブジェクトでもう片方が
Rational オブジェクトのときの加算は、Integer
オブジェクトを Rational に拡大変換した上で、Rational
どうしの加算を行う。
左辺値 a と右辺値 b が共に Float
オブジェクトのときの加算結果は、a と b の表す実数を
それぞれ v, w として、実数 v + w
を表す Float オブジェクトである。結果の絶対精度は
−log10(10−ap(a) +
10−ap(b)) とする。
左辺値と右辺値の片方が Integer または Rational
オブジェクト a でもう片方が Float オブジェクト
b のときの加算結果は、a が表す整数または有理数を
v、b の表す実数を w として、実数 v + w を表す Float オブジェクトである。
結果の絶対精度は b の絶対精度に等しい。
左辺値 a と右辺値 b が共に Complex
オブジェクトのときの加算結果は、Complex[a.re + b.re, a.im + b.im]
の結果に等しい。
左辺値と右辺値の片方が Real オブジェクトでもう片方が
Complex オブジェクトのときの加算は、Real
オブジェクトを Complex に拡大変換した上で、Complex
どうしの加算を行う。
$incrementインクリメント演算 $increment は前置単項演算子 ++ および後置単項演算子 ++
で使われる。
Number オブジェクト a に対するインクリメント
演算の結果は、a + 1 の結果に等しい。
$minus反数演算 $minus は前置単項演算子 - に対応する。
Integer オブジェクト a に対する反数演算の結果は、
a の表す整数を v とすると、整数
−v を表す Integer オブジェクトである。
Rational オブジェクト a に対する反数演算の結果は、
Rational[-a.nu,
a.de] の結果に等しい。
ただし、結果の Rational オブジェクトの表す有理数の分母が 1
ならば、代わりにその有理数の分子の値を表す Integer
オブジェクトを結果としてもよい。
Float オブジェクト a に対する反数演算の結果は、
a の表す実数を v として、
実数 −v を表す Float オブジェクトである。
結果の絶対精度は、a のそれに等しい。
Complex オブジェクト a に対する反数演算の結果は、
Complex[-a.re, -a.im] の結果に等しい。
正の無限大を表す Infinity オブジェクトに対する反数演算の結果は、
負の無限大を表す Infinity オブジェクトである。負の無限大を表す
Infinity オブジェクトに対する反数演算の結果は、正の無限大を表す
Infinity オブジェクトである。複素無限大を表す Infinity
オブジェクトに対する反数演算の結果は、複素無限大を表す Infinity
オブジェクトである。
NaN オブジェクトに対する反数演算の結果は、NaN
オブジェクトである。
$subtract減算 $subtract は二項演算子 - に対応する。
左辺値 a と右辺値 b が共に Number
オブジェクトであるときの減算の結果は、a
+ (-b) の結果に等しい。
$decrementデクリメント演算 $decrement は前置単項演算子 -- および後置単項演算子 --
で使われる。
Number オブジェクト a に対するデクリメント
演算の結果は、a - 1 の結果に等しい。
$multiply乗算 $multiply は二項演算子 * に対応する。
左辺値または右辺値が非有限数オブジェクトであるときの乗算結果は下表の通り:
| 左辺値 | 右辺値 | 結果 |
|---|---|---|
| NaN | 任意 | NaN |
| 任意 | NaN | NaN |
| ∞ | ∞/+∞/−∞ | ∞ |
| ∞/+∞/−∞ | ∞ | ∞ |
| +∞ | +∞ | +∞ |
| −∞ | −∞ | +∞ |
| +∞ | −∞ | −∞ |
| −∞ | +∞ | −∞ |
| ∞/+∞/−∞ | 零 Complex | NaN |
| 零 Complex | ∞/+∞/−∞ | NaN |
| ∞/+∞/−∞ | 非零 Complex | ∞ |
| 非零 Complex | ∞/+∞/−∞ | ∞ |
| ∞/+∞/−∞ | 零 Real | NaN |
| 零 Real | ∞/+∞/−∞ | NaN |
| ∞ | 非零 Real | ∞ |
| 非零 Real | ∞ | ∞ |
| +∞ | 正 Real | +∞ |
| +∞ | 負 Real | −∞ |
| 正 Real | +∞ | +∞ |
| 負 Real | +∞ | −∞ |
| −∞ | 正 Real | −∞ |
| −∞ | 負 Real | +∞ |
| 正 Real | −∞ | −∞ |
| 負 Real | −∞ | +∞ |
左辺値と右辺値が共に Integer オブジェクトのときの乗算結果は、
左辺値の表す値を v、右辺値の表す値を w として、整数
v × w を表す Integer
オブジェクトである。
左辺値 a と右辺値 b が共に Rational
オブジェクトのときの乗算結果は、Rational[a.nu * b.nu,
a.de * b.de] の結果に等しい。
ただし、結果の Rational オブジェクトの表す有理数の分母が 1
ならば、代わりにその有理数の分子の値を表す Integer
オブジェクトを結果としてもよい。
左辺値と右辺値の片方が Integer オブジェクトでもう片方が
Rational オブジェクトのときの乗算は、Integer
オブジェクトを Rational に拡大変換した上で、Rational
どうしの乗算を行う。
左辺値 a と右辺値 b が共に Float
オブジェクトのときの乗算結果は、a と b の表す値を
それぞれ v, w として、実数 v × w
を表す Float オブジェクトである。
結果の精度は次のように算出する:
ただし、上記の場合分けにおける 0 との比較は、実数の比較によって行う。
左辺値と右辺値の片方が Integer または Rational
オブジェクト a でもう片方が Float オブジェクト
b のときの乗算結果は、a の表す整数または有理数を
v、b の表す実数を w とすると、
Float オブジェクト。
相対精度は a の相対精度に等しい。Float オブジェクト。
絶対精度は ap(b) − log10|v| とする。Integer オブジェクトで、v
= 0 のときInteger オブジェクト。Rational オブジェクトで、v
= 0 のときInteger オブジェクトまたは
Rational オブジェクト。ただし、上記の場合分けにおける 0 との比較は、実数の比較によって行う。
左辺値 a と右辺値 b が共に Complex
オブジェクトのときの乗算結果は、Complex[a.re * b.re - a.im *
b.im, a.re * b.im + a.im *
b.re] の結果に等しい。
左辺値と右辺値の片方が Real オブジェクトでもう片方が
Complex オブジェクトのときの乗算は、Real
オブジェクトを Complex に拡大変換した上で、Complex
どうしの乗算を行う。
$juxtapose結合演算 $juxtapose は結合演算子に対応する。
左辺値と右辺値が共に Number
オブジェクトであるときの結合演算は、同じ左辺値・右辺値に対する乗算に等しい。
左辺値 a が Number オブジェクトで右辺値
b が関数オブジェクトであるときの結合演算の結果は、以下のような新しい関数オブジェクトである:
$prototype
内部メンバ以外にメンバ・内部メンバを持たない。$reciprocal逆数演算 $reciprocal は前置単項演算子 / に対応する。
Rational オブジェクト a に対する逆数演算の結果は、
a.nu の表す値が 0 でなければ、
Rational[a.de,
a.nu] の結果に等しい。
ただし、結果の Rational オブジェクトの表す有理数の分母が 1
ならば、代わりにその有理数の分子の値を表す Integer
オブジェクトを結果としてもよい。a.nu の表す値が 0
ならば、結果は複素無限大を表す Infinity オブジェクトである。
Integer オブジェクトに対する逆数演算は、そのオブジェクトを
Rational に拡大変換し、その結果に対して上記の逆数演算を行う。
Float オブジェクト a
に対する逆数演算の結果は次のように定める:
Infinity オブジェクトである。Float オブジェクトである。
結果の相対精度は a のそれに等しい。Complex オブジェクト a
に対する逆数演算の結果は、Complex.conj[a] / Math.abs2[a]
の結果に等しい。
Infinity オブジェクトに対する逆数演算の結果は、整数 0 を表す
Integer オブジェクトである。
NaN オブジェクトに対する逆数演算の結果は、NaN
オブジェクトである。
$divide除算 $divide は二項演算子 / に対応する。
左辺値 a と右辺値 b が共に Number
オブジェクトであるときの除算の結果は、a
* (/b) の結果に等しい。
$quotient商演算 $quotient は二項演算子 \ に対応する。
左辺値と右辺値の少なくとも一方が NaN オブジェクトであるときの
冪算結果は、NaN オブジェクトである。
左辺値 a と右辺値 b が共に Real
オブジェクトであるときの商演算の結果は、Math.floor[a / b] の結果に等しい。
$mod剰余演算 $mod は二項演算子 % に対応する。
左辺値と右辺値の少なくとも一方が NaN オブジェクトであるときの
冪算結果は、NaN オブジェクトである。
左辺値 a と右辺値 b が共に Real
オブジェクトであるときの剰余演算の結果は、a -
b * (a \ b) の結果に等しい。
$power冪算 $power は二項演算子 ^/** に対応する。
左辺値と右辺値が共に Number オブジェクトであり、
それらの少なくとも一方が NaN オブジェクトであるときの
冪算結果は、NaN オブジェクトである。
左辺値 a と右辺値 b が共に Integer
オブジェクトであるときの冪算は、次のように定める:
Integer オブジェクトをこの冪算の結果とする。/(a ^ -b)
の結果をこの冪算の結果とする。Integer オブジェクトである。NaN
オブジェクトである。左辺値 a が Integer オブジェクトで右辺値
b が Rational オブジェクトであるときの冪算は、
次のように定める:
b.de 乗して a になるような整数が
存在するならば、そのような整数を表す Integer オブジェクトを
r として、r ^ b.nu
の結果をこの冪算の結果とする。ただし、このような整数が複数存在する場合は、
それらのうちもっとも大きいものを選択する。Float に拡大変換し、
Float オブジェクトを左辺値、Rational
オブジェクトを右辺値とする冪算を行う。左辺値 a が Rational オブジェクトで右辺値
b が Integer オブジェクトであるときの冪算結果は、
a.nu ^ b / a.de ^ b
の結果に等しい。
左辺値 a と右辺値 b が共に Rational
オブジェクトであるときの冪算は、次のように定める:
NaN オブジェクトである。a.nu ^ b と a.de ^
b の結果がどちらも Integer オブジェクトまたは
Rational オブジェクトならば、a.nu ^ b
/ a.de ^ b の結果をこの冪算の結果とする。Float に拡大変換し、
Float オブジェクトを左辺値、Rational
オブジェクトを右辺値とする冪算を行う。左辺値 a が Integer オブジェクトまたは
Rational オブジェクトで右辺値 b が Float
オブジェクトのときの冪算は、次のように定める:
Integer オブジェクトまたは Rational
オブジェクトである。ただし、このとき a が Integer
オブジェクトならば結果も Integer オブジェクトとする。(-1)^Integer[b] *
(-a)^b
の結果をこの冪算の結果としてもよい。-(-a)^b
の結果をこの冪算の結果としてもよい。Infinity オブジェクトである。NaN オブジェクトである。Math.exp[b *
Math.log[a]]
の結果をこの冪算の結果とする。ただし、b
の絶対精度が現在の実行コンテクストのデフォルトの精度よりも大きく
かつ無限大でないときは、この冪算においてのみ
現在の実行コンテクストのデフォルトの精度を b
の絶対精度に変更して計算を行う。ただし、上記の場合分けにおける 0 との比較は、実数の比較によって行う。
左辺値 a が Float オブジェクトで右辺値
b が Integer または Rational
オブジェクトのときの冪算は、次のように定める:
Float オブジェクトである。ただし、結果の絶対精度は
b * ap(a) + (b − 1) log102
とする。(-1)^b * (-a)^b
の結果をこの冪算の結果とする。-(-a)^b の結果をこの冪算の結果とする。Infinity オブジェクトである。NaN オブジェクトである。Math.exp[b *
Math.log[a]]
の結果をこの冪算の結果とする。ただし、上記の場合分けにおける 0 との比較は、実数の比較によって行う。
実装上の注意: 右辺値が整数のときは、左辺値の乗算の繰り返しおよび逆数演算によって左辺値の右辺値乗を求め、それを結果としてもよい。例えば、1.25^-3 を /(1.25 * 1.25 * 1.25)
によって計算してもよい。
左辺値 a と右辺値 b が共に Float
オブジェクトであるときの冪算は、次のように定める:
Float オブジェクトである。ただし、結果の絶対精度は
b * ap(a) + (b − 1) log102
とする。(-1)^Integer[b] *
(-a)^b
の結果をこの冪算の結果としてもよい。-(-a)^b
の結果をこの冪算の結果としてもよい。Infinity オブジェクトである。NaN オブジェクトである。Math.exp[b *
Math.log[a]]
の結果をこの冪算の結果とする。ただし、a の絶対精度が無限大であって、
b の絶対精度が現在の実行コンテクストのデフォルトの精度よりも大きく
かつ無限大でないときは、この冪算においてのみ
現在の実行コンテクストのデフォルトの精度を b
の絶対精度に変更して計算を行う。ただし、上記の場合分けにおける 0 との比較は、実数の比較によって行う。
左辺値と右辺値が共に Real オブジェクトである
冪算では、左辺値と右辺値が共に 0 ならば結果は常に NaN、
左辺値が 0 で右辺値が負ならば結果は常に複素無限大となる。
左辺値 a と右辺値 b が共に Complex
オブジェクトであるときの冪算は、次のように定める:
a.re = 0 かつ a.im = 0
ならば、
b.im が 0 を表す Integer
オブジェクトまたは Rational オブジェクトならば、
b.re > 0 ならば、
a.re と a.im
がどちらも Integer オブジェクトならば、
冪算の結果は、実部・虚部が共に 0 を表す Integer オブジェクト
であるような Complex オブジェクトである。a.re と a.im
がどちらも Integer オブジェクトまたは Rational
オブジェクトならば、冪算の結果は、実部・虚部が共に 0 を表す
Integer オブジェクトまたは Rational
オブジェクトであるような Complex オブジェクトである。Float
オブジェクトであるような Complex オブジェクトである。
ただし、Float オブジェクトの絶対精度は実部・虚部どちらも
b * ap(a) + (b − 1) log102
とする (ここで、ap(a) は a の実部の絶対精度と虚部の
絶対精度の最小値である。Integer オブジェクトまたは
Rational オブジェクトの絶対精度は無限大と見なす)。また、
ここでさらに b.re が正の整数を表す
Integer オブジェクトまたは Rational
オブジェクトならば、代わりに乗算の繰り返しによって
a の b 乗を求め、それを冪算の結果としても良い。b.re = 0 ならば、冪算の結果は NaN
オブジェクトである。b.re < 0 ならば、冪算の結果は複素無限大を表す
Infinity オブジェクトである。a ^ b.re *
Complex[cos[b.im],
sin[b.im]]
の結果を冪算の結果とする。Math.exp[b *
Math.log[a]]
の結果に等しい。
ただし、以下に挙げる特別な場合に当てはまるときは、上記の定義の代わりに
以下の定義を用いても良い:
a.re の表す値が負、b.re が
1/2 を表す Rational オブジェクトで、a.im および b.im が 0 に等しい Integer
オブジェクトまたは Rational オブジェクトのとき1i * (-a.re) ^ /2a.re の表す値が負、b.re が
1/4 を表す Rational オブジェクトで、a.im および b.im が 0 に等しい Integer
オブジェクトまたは Rational オブジェクトのとき(1 + 1i) * (-a.re / 4) ^ /4a.im の表す値が正、b.re が
1/2 を表す Rational オブジェクトで、a.re および b.im が 0 に等しい Integer
オブジェクトまたは Rational オブジェクトのとき(1 + 1i) * (a.im / 2) ^ /2a.im の表す値が負、b.re が
1/2 を表す Rational オブジェクトで、a.re および b.im が 0 に等しい Integer
オブジェクトまたは Rational オブジェクトのとき(1 - 1i) * (-a.im / 2) ^ /2a.re、a.im、b.re、b.im がどれも Integer
オブジェクトまたは Rational オブジェクトで、かつ
a.re の表す値が負で、a.re と
-a.im の値が等しく、b.re は 1/3
に、b.im は 0 に等しいとき(1 + 1i) * (-a.re / 2) ^ /3a.re、a.im、b.re、b.im がどれも Integer
オブジェクトまたは Rational オブジェクトで、かつ
a.re の表す値が負で、a.re と
a.im の値が等しく、b.re は 1/3
に、b.im は 0 に等しいとき(1 - 1i) * (-a.re / 2) ^ /3b.re と b.im が共に
Integer オブジェクトまたは Rational
オブジェクトであって、かつ b.re の表す値が整数であり、
b.im の表す値が 0 に等しいとき
(ただし、a.re、a.im、
b.re の値が全て 0 である場合を除く)
b.re が Rational オブジェクトであり、
かつ b.im が 0 を表す Integer オブジェクト
または Rational オブジェクトであるとき(a ^ /b.re.de) ^ b.re.nuただし、上記の場合分けにおける 0 との比較および符号の判定は、実数の比較によって行う。
左辺値と右辺値の片方が Real オブジェクトでもう片方が
Complex オブジェクトのときの冪算は、Real
オブジェクトを Complex に拡大変換した上で、Complex
どうしの冪算を行う。
左辺値が正の無限大を表す Infinity オブジェクトであるときの冪算は
次のように定める:
Infinity オブジェクトならば、
結果は正の無限大を表す Infinity オブジェクトである。Infinity オブジェクトならば、
結果は整数 0 を表す Integer オブジェクトである。Infinity オブジェクトならば、
結果は NaN オブジェクトである。Real オブジェクト b ならば、
NaN
オブジェクトである。Infinity オブジェクトである。Integer オブジェクトである。Complex オブジェクト b ならば、
NaN
オブジェクトである。Infinity オブジェクトである。Integer オブジェクトである。ただし、上記の場合分けにおける 0 との比較および符号の判定は、実数の比較によって行う。
左辺値が負の無限大を表す Infinity オブジェクトであるときの冪算は
次のように定める:
Infinity オブジェクトならば、
結果は複素無限大を表す Infinity オブジェクトである。Infinity オブジェクトならば、
結果は整数 0 を表す Integer オブジェクトである。Infinity オブジェクトならば、
結果は NaN オブジェクトである。Integer オブジェクトまたは Rational
オブジェクト b ならば、
(-1)^b *
@inf^b の結果に等しい。-@inf^b の結果に等しい。NaN オブジェクトである。Float オブジェクト b ならば、
(-1)^b *
@inf^b の結果をこの冪算の結果としても良い。-@inf^b
の結果をこの冪算の結果としても良い。NaN オブジェクトである。Complex オブジェクト b ならば、結果は
NaN オブジェクトである。ただし、上記の場合分けにおける 0 との比較および符号の判定は、実数の比較によって行う。
左辺値が複素無限大を表す Infinity オブジェクトであるときの冪算は
次のように定める:
Infinity オブジェクトならば、
結果は複素無限大を表す Infinity オブジェクトである。Infinity オブジェクトならば、
結果は整数 0 を表す Integer オブジェクトである。Infinity オブジェクトならば、
結果は NaN オブジェクトである。Real オブジェクト b ならば、
NaN
オブジェクトである。Infinity オブジェクトである。Integer オブジェクトである。Complex オブジェクト b ならば、
NaN
オブジェクトである。Infinity オブジェクトである。Integer オブジェクトである。ただし、上記の場合分けにおける 0 との比較および符号の判定は、実数の比較によって行う。
左辺値 a が有限数オブジェクトで、右辺値が正の無限大を表す
Infinity オブジェクトであるときの冪算は次のように定める:
Real オブジェクトならば、
Complex オブジェクトならば、
(-Math.abs[a])^@inf
の結果を冪算結果とする。
左辺値 a が有限数オブジェクトで、右辺値が負の無限大を表す
Infinity オブジェクトであるときの冪算は次のように定める:
Real オブジェクトならば、
Complex オブジェクトならば、
(-Math.abs[a])^(-@inf)
の結果を冪算結果とする。
左辺値 a が有限数オブジェクトで、右辺値が複素無限大を表す
Infinity オブジェクトであるときの冪算結果は、NaN
オブジェクトである。
$less比較演算 $less は二項演算子 < に対応する。
左辺値 a と右辺値 b が共に Real
オブジェクトであるときの比較演算 $less の結果は、a と b に対して実数の比較を行い、その結果が「<」ならば初期の Boolean.true、さもなくば初期の Boolean.false を結果とする。
正および負の無限大を表す Infinity オブジェクトに関する比較演算
$less の結果は下表の通り:
| 左辺値 | 右辺値 | 結果 |
|---|---|---|
| +∞ | +∞ | false |
| +∞ | Real | false |
| +∞ | −∞ | false |
| −∞ | +∞ | true |
| −∞ | Real | true |
| −∞ | −∞ | false |
| Real | +∞ | true |
| Real | −∞ | false |
$greater比較演算 $greater は二項演算子 >
に対応する。
左辺値 a と右辺値 b が共に Real
オブジェクトであるときの比較演算 $greater の結果は、a と b に対して実数の比較を行い、その結果が「>」ならば初期の Boolean.true、さもなくば初期の Boolean.false を結果とする。
正および負の無限大を表す Infinity オブジェクトに関する比較演算
$greater の結果は下表の通り:
| 左辺値 | 右辺値 | 結果 |
|---|---|---|
| +∞ | +∞ | false |
| +∞ | Real | true |
| +∞ | −∞ | true |
| −∞ | +∞ | false |
| −∞ | Real | false |
| −∞ | −∞ | false |
| Real | +∞ | false |
| Real | −∞ | true |
$lessEqual比較演算 $lessEqual は二項演算子 <=
に対応する。
左辺値 a と右辺値 b が共に Real
オブジェクトであるときの比較演算 $lessEqual の結果は、a と b に対して実数の比較を行い、その結果が「<」または「=」ならば初期の Boolean.true、さもなくば初期の Boolean.false を結果とする。
正および負の無限大を表す Infinity オブジェクトに関する比較演算
$lessEqual の結果は下表の通り:
| 左辺値 | 右辺値 | 結果 |
|---|---|---|
| +∞ | +∞ | true |
| +∞ | Real | false |
| +∞ | −∞ | false |
| −∞ | +∞ | true |
| −∞ | Real | true |
| −∞ | −∞ | true |
| Real | +∞ | true |
| Real | −∞ | false |
$greaterEqual比較演算 $greaterEqual は二項演算子 >=
に対応する。
左辺値 a と右辺値 b が共に Real
オブジェクトであるときの比較演算 $greaterEqual の結果は、a と b に対して実数の比較を行い、その結果が「>」または「=」ならば初期の Boolean.true、さもなくば初期の Boolean.false を結果とする。
正および負の無限大を表す Infinity オブジェクトに関する比較演算
$greaterEqual の結果は下表の通り:
| 左辺値 | 右辺値 | 結果 |
|---|---|---|
| +∞ | +∞ | true |
| +∞ | Real | true |
| +∞ | −∞ | true |
| −∞ | +∞ | false |
| −∞ | Real | false |
| −∞ | −∞ | true |
| Real | +∞ | false |
| Real | −∞ | true |
この仕様では、複素無限大を表す Infinity
オブジェクトおよび NaN オブジェクトに関する比較演算
$less/$greater/$lessEqual/$greaterEqual は定義しない。
$equal比較演算 $equal は二項演算子 == に対応する。
左辺値または右辺値が非有限数オブジェクトであるときの比較演算
$equal の結果は、次の条件のどれかが満たされるならば初期の Boolean.true、さもなくば初期の Boolean.false である。
NaN オブジェクトである。Infinity
オブジェクトである。Infinity
オブジェクトである。Infinity
オブジェクトである。#Script では、NaN どうしの比較は等しいと判断される。これは IEEE 754
浮動小数点演算規則による NaN の扱いとは異なる。またこの仕様では、演算子
== による NaN どうしの比較は定義されているが演算子
<= や >= による NaN の比較は定義していない。
左辺値 a と右辺値 b が共に Real
オブジェクトであるときの比較演算 $equal の結果は、a と b に対して実数の比較を行い、その結果が「=」ならば Boolean.true、さもなくば Boolean.false を結果とする。
左辺値と右辺値が共に Complex オブジェクトであるときの比較演算
$equal の結果は、左辺値と右辺値の re プロパティどうし
および im プロパティどうしの比較演算 $equal を行い、
その結果が共に Boolean.true ならば Boolean.true、
さもなくば Boolean.false を結果とする。
左辺値と右辺値の片方が Real オブジェクトでもう片方が
Complex オブジェクトのときの比較演算 $equal
は、Real オブジェクトを Complex に拡大変換した上で
Complex どうしの比較演算 $equal を行う。
$unequal比較演算 $unequal は二項演算子 !=
に対応する。
左辺値と右辺値が共に Number オブジェクトであるときの比較演算
$unequal の結果は、それらの値に対して比較演算 $equal
を行い、その結果が Boolean.false ならば Boolean.true、さもなくば
Boolean.false を結果とする。
Real オブジェクトどうしの比較は次のように行い、
「<」「=」「>」のうちのどれかを結果として返す:
左辺値と右辺値が共に Integer オブジェクトのときの比較は、
左辺値の表す整数を v、右辺値の表す整数を w として、
v < w ならば「<」、
v = w ならば「=」、v > w
ならば「>」を返す。
左辺値 a と右辺値 b が共に Rational
オブジェクトのときの比較は、a.nu * b.de
を左辺値、b.nu * a.de を右辺値とする
Integer どうしの比較に等しい。
左辺値と右辺値の片方が Integer オブジェクトでもう片方が
Rational オブジェクトのときの比較は、Integer
オブジェクトを Rational に拡大変換した上で、Rational
どうしの比較を行う。
左辺値 a と右辺値 b が共に Float
オブジェクトのときの比較は、次のように行う:
value 内部メンバの値をそれぞれ
v, w とする。左辺値 a が Rational オブジェクトで右辺値
b が Float オブジェクトのときの比較は、
次のように行う:
Float
オブジェクトに拡大変換し、Float どうしの比較を行う。
ただし拡大変換の際には、変換結果の絶対精度が b
のそれに等しくなるようにする。左辺値が Float オブジェクトで右辺値が Rational
オブジェクトのときの比較は、左辺値と右辺値を入れ替えて比較を行い、その結果が
「<」ならば「>」を、「=」ならば「=」を、「>」ならば「<」を結果とする。
左辺値と右辺値の片方が Integer オブジェクトでもう片方が
Float オブジェクトのときの比較は、Integer
オブジェクトを Rational オブジェクトに拡大変換した上で、
Rational オブジェクトと Float
オブジェクトとの比較を行う。
実数の比較は Real オブジェクトの符号の判定に
用いられることがある。Real オブジェクト a
が実数の比較によって a = 0 であるとは、a を左辺値とし、0
を表す Integer オブジェクトを右辺値として実数の比較を行い、
その結果が「=」となることである。a ≠ 0
等の場合も同様である (下表参照)。
| 条件 | 比較結果 |
|---|---|
| a = 0 | 「=」 |
| a ≠ 0 | 「<」または「>」 |
| a < 0 | 「<」 |
| a > 0 | 「>」 |
| a ≤ 0 | 「=」または「<」 |
| a ≥ 0 | 「=」または「>」 |