講義資料 前回の講義のまとめ

2014 年度・前期・数理解析・計算機数学3・第4回
1
● 講義資料
▼ 講義予定
• 円周率の近似値の計算と浮動小数点演算の誤差
• テイラー級数による円周率の近似値の計算
● 前回の講義のまとめ
▼ 浮動小数点演算
• ここでは, 考える浮動小数点数の体系を F とおく. (特に, β 進 p 桁の浮動小数点を考える
ときには F = F (β, p) と書くこともある.)倍精度浮動小数点数の体系は β = 2, p = 53 で
ある.
• 実数 x ∈ R を, 浮動小数点数として代入すると, β, p に依存する定数 ǫ > 0 が存在して,
|x − x| < ǫ|x|
が成り立つ. ここで, x ∈ F は, x を F = F (β, p) に代入した値である.
• 一般に使われる「丸めモード」は, 通常の「四捨五入」に対応する「nearest rounding」(一
番近い数への近似)であり, その際には, ǫ = (β/2)β −p = β 1−p /2 となる. 特に F (2, 53) に
対しては, ǫ = 2−53 となる.
• 浮動小数点数 x, y ∈ F に対して, その四則演算を · とおく. すなわち, x · y は, x + y, x − y,
x × y, x/y のいずれかである. この時, 実際に行われる演算の結果を x ⊙ y (x ⊕ y, x ⊖ y,
x ⊗ y, x ⊘ y のいずれか) とおき, x · y と x ⊙ y の相対誤差を評価することを考える.
• 実際に行われる浮動小数点演算の概要は以下の通り.
– 乗算(および除算)の場合(x ⊗ y の計算)
1. x ∈ F の仮数部と y ∈ F の仮数部の積(除算)を計算する.
2. 仮数部の積に桁上がりが無い場合, 仮数部の積を p 桁に丸める.
仮数部の積に桁上がりがある場合, 必要な桁移動を行ったうえで p 桁に丸める.
3. x ∈ F の指数部と y ∈ F の指数部の和(差)を計算する.
4. 得られた仮数部と指数部の結果から浮動小数点数 x ⊗ y (x ⊘ y) を構成する.
この手順で「誤差」が生じるのは, 仮数部の積の桁移動と丸めの部分である.
– 同一の符号をもつ数に対する加算の場合(x ⊕ y の計算)以下では, x ≥ y と仮定する.
1. y ∈ F の仮数部を x ∈ F の仮数部の桁にそろうように桁移動する.
2. 桁移動した後の仮数部の和を計算する.
3. 仮数部の和に桁上がりが無い場合, 仮数部の和を p 桁に丸める.
仮数部の和に桁上がりがある場合, 必要な桁移動を行ったうえで p 桁に丸める.
4. 得られた仮数部の結果から浮動小数点数 x ⊕ y を構成する. 指数部は(桁上がりが
あれば, それを調整して) x の指数部をそのまま使えば良い.
Oct. 22, 2014, Version: 1.0
[email protected]
2014 年度・前期・数理解析・計算機数学3・第4回
2
この手順で「誤差」が生じるのは, y (小さい方の数)の最初の桁移動, 仮数部の和の桁
移動と丸めの部分である.
– 同一の符号をもつ数に対する減算の場合(x ⊖ y の計算) も加算と手順は同じである
が, このままではうまく行かない.
∗ F (10, 3) において, x = 1.00 × 100 , y = 9.99 × 10−1 に対して, x ⊖ y を上の手順で
計算すると, x − y = 0.001, x ⊖ y = 0.01 となり, 相対誤差が 90 となってしまう.
∗ このような問題を解消するために「保護桁」が用いられる. 保護桁とは, 浮動小数
点数演算を行う際に仮数部の桁数を(演算の時のみ)余分に与えたものである.
• 浮動小数点演算の誤差については, 次の事実が成り立つ.
保護桁が無くても, 加算・乗算・除算に関しては,
|(x · y) − (x ⊙ y)| ≤ 2ǫ|x · y|,
x, y ∈ F
が成り立つ. また, 保護桁が 1 桁あれば, 減算に対しても同じ評価が成り立つ.
通常の浮動小数点演算に関しては, 保護桁が 1 桁用意されているので, 四則演算については,
相対誤差 2ǫ で計算できていると考えて良い.
• 加算の場合の上の評価の証明は, 以下の通り.
いま, x ≥ y > 0 と仮定する. この時, y を桁移動すると, β 1−p の丸め誤差が発生する. いま,
和の結果に桁あがりがないと仮定すると, 和 x + y ≥ 1 であり, β −p+1 = 2ǫ であるので,
|(x ⊕ y) − (x + y)| ≤ 2ǫ ≤ 2ǫ|x + y|
が成り立つ.
次に桁上がりがあると仮定すると, y のシフト時の rounding error 2ǫ の他に, 桁上がりの桁
移動時に, (1/2)β −2+p の誤差が発生する. (1/2 は丸めを行うため)また, x + y ≥ β である
ので,
|(x ⊕ y) − (x + y)| ≤ (β −p+1 + (1/2)β −p+2 ) = β −p (1 + β/2)/β ≤ β −p (1 + β/2)|x + y|
が成り立つ. ここで,
β −p (1 + β/2) ≤ β 1−p = 2ǫ
を使えば,
|(x ⊕ y) − (x + y)| ≤ 2ǫ|x + y|
が成り立つ.
• β = 2, nearest rounding の場合には, 2ǫ = 21−p である. これは, 「2進数で書いたとき, 最
後の1桁が信用できない」ということをあらわしている. これを, 「最後の1桁が汚染されて
いる」, 「汚染桁は 1 桁」, 「1 ulp の誤差がある」などと表現する.
Oct. 22, 2014, Version: 1.0
[email protected]
2014 年度・前期・数理解析・計算機数学3・第4回
3
▼ 自然対数の底 e の近似値の計算について
• 今回考えるのは,
n
1
an = 1 +
n
の値を計算することによって, 自然対数の底 e の近似値を求める. 数列 {an } は, 単調増加か
つ上に有界である. また, 簡単な計算から, 任意の n ≥ 2 に対して, 2 < an < 3 が成り立つ.
よって, e = limn→∞ an が存在し, 2 < e ≤ 3 が成り立つ.
• 数学的には
an = e −
e
+ O(n−2 )
2n
が成り立つ.
証明は, log(1 + x) のテイラー展開に x = 1/n を代入し, さらにその結果を exp(x) のテイ
ラー展開に適用すればよい.
• 上の評価式は(n に関する −2 次以上の無視すれば
|an − e| ≤
e
2n
と書けるので,
e
– e の近似値を誤差 ǫ 以下で求めたい場合,
< ǫ をみたす最小の自然数 N をとり,
2n
n ≥ N となる an を計算すればよいことがわかる. これは, 数列 {an } が e に収束する
3
e
≤
であるこ
ことの定義である ǫ-N 論法そのものである. この場合, N としては
2ǫ
2ǫ
3
とから, N ≥ ⌊ ⌋ ととれば十分である.
2ǫ
1
< ǫ をみたす最小の自然数 N をとり,
– e の近似値を相対誤差 ǫ 以下で求めたい場合,
2n
1
n ≥ N となる an を計算すればよいことがわかる. この場合, N としては N ≥ ⌊ ⌋ と
2ǫ
とれば十分である.
• しかし, 浮動小数点演算の演算誤差によって, 実際の an の計算値 an は,
|e − an | ∼
e
+ Cn
2n
という挙動を示し, ある程度以上大きな n に対しては, an は e を近似しなくなる.
• 実際に計算結果として得ることができるのは, an の浮動小数点演算の結果であり, (1 + 1/n)
を n 回乗算することによって得られる結果 an は,
|an − an | ≤ 2(n − 1)ǫ|an |
となる. 実際, δ = 2ǫ とおけば,
|((1 + 1/n) ⊗ (1 + 1/n)) − ((1 + 1/n) × (1 + 1/n))| < δ|(1 + 1/n)2 |,
|(((1 + 1/n) ⊗ (1 + 1/n)) ⊗ (1 + 1/n)) − (((1 + 1/n) × (1 + 1/n)) × (1 + 1/n))|
< δ|((1 + 1/n) ⊗ (1 + 1/n)) × (1 + 1/n)| < 2δ|(1 + 1/n)3 |
Oct. 22, 2014, Version: 1.0
[email protected]
2014 年度・前期・数理解析・計算機数学3・第4回
4
k
となる. 繰り返し2乗法(高速乗算法)を用いても, (1 + 1/n)2 の段階で, おおよそ 2k δ の
誤差が含まれているので, 同一の結果を得ることになる. (この計算は, (1 + 1/n) そのもの
のが F で正確に表現できていると仮定しているが, 実際には, (1 + 1/n) が F で相対誤差 ǫ
を含んでいると考えるべきである.)
• 以上により, 実際に得られた (1 + 1/n)n の値 an は,
|an − e| ∼
e
+ nδ,
2n
δ = 2n
となることがわかる.
p
√
e
+ nδ ∼ δ となる.
• 上式の右辺は, n = e/(2δ) ∼ δ の時に最小となり, その時の値は, 2n
−52
−8
いま, δ ∼ 2
であるので, およそ 10 程度の精度でしか e の近似値を求めることはでき
ない.
● 講義資料
▼ 円周率の近似値を求める
半角の公式を利用して, π の近似値を求めた例(π と近似値の値との絶対誤差を表示している)
Calculate Pi (1)
1
inner
outer(1)
outer(2)
0.1
0.01
0.001
0.0001
1e-05
1e-06
1e-07
1e-08
1e-09
1
10
100
ℓ2n = 2n
1000
s
1−
10000
100000
1e+06
1e+07
1e+08
1e+09
p
1 − (ℓn /n)2
,
2
2n2 p
1 + (Ln /n)2 − 1 ,
Ln
π
π
ℓn = n sin( ), Ln = n tan( ),
n
n
L2n =
Oct. 22, 2014, Version: 1.0
[email protected]
2014 年度・前期・数理解析・計算機数学3・第4回
5
半角の公式を書き直して π の近似値を求めた例
Calculate Pi (2)
1
inner(3)
outer(3)
inner(4)
outer(4)
0.01
0.0001
1e-06
1e-08
1e-10
1e-12
1e-14
1e-16
1
10
100
1000
10000
100000
1e+06
1e+07
1e+08
1e+09
√
2ℓn
= q
,
p
1 + 1 − (ℓ/n)2
ℓ2n
2Ln
L2n = p
1 + (Ln /n)2 + 1
1
1 1
1
,
=
+
L2n
2 ℓn
Ln
p
ℓ2n = ℓn L2n ,
arctan(x) の近似値をテイラー級数を用いて計算した例
1
x=1
x = 0.999
x = 0.99
x = 0.9
0.01
0.0001
1e-06
1e-08
1e-10
1e-12
1e-14
1e-16
1
10
arctan(x) = x −
Oct. 22, 2014, Version: 1.0
100
1000
10000
x5
(−1)2n x2n+1
x3
+
+ ···+
+ ···
3
5
2n + 1
[email protected]
2014 年度・前期・数理解析・計算機数学3・第4回
6
● 実習内容
(以下で「★」の数は推奨の程度を示します. 多いほど推奨の度合いが大きい. また, 「†」は
難易度またはマニアックな程度を表します. 多いほど難しいかマニアックかです.)
1. (★★★)半角の公式を書き直した式
ℓ2n
√
2ℓn
=q
,
p
1 + 1 − (ℓ/n)2
2Ln
L2n = p
1 + (Ln /n)2 + 1
を用いて π の近似値を計算しなさい. さらに, π とそれぞれの近似値の絶対誤差のグラフを
書きなさい.
2. (★★★)半角の公式とそれから派生する公式
1
1 1
1
,
=
+
L2n
2 ℓn
Ln
p
ℓ2n = ℓn L2n ,
を用いて π の近似値を計算しなさい. さらに, π とそれぞれの近似値の絶対誤差のグラフを
書きなさい.
3. (★★★)ライプニッツの公式で π の近似値を計算しなさい.
4. (★★★)マチンの公式で π の近似値を計算しなさい. また, ライプニッツの公式での計算
時間(計算回数)との比較をしなさい.
5. (★★★)自然対数の底 e の近似値を相対誤差 10−14 以内で計算しなさい.
6. (★★†)x ∈ [0, 1] に対して, ex の近似値を相対誤差 10−14 以内で計算しなさい. プログラ
ムの第一引数に x の値を与えて, ex の近似値を出力するように書きなさい.
7. (★★)sin(1.0) の近似値を相対誤差 10−14 以内で計算しなさい.
8. (★†)x ∈ [−π/2, π/2] に対して, sin(x) の近似値を相対誤差 10−14 以内で計算しなさい.
プログラムの第一引数に x の値を与えて, sin(x) の近似値を出力するように書きなさい.
9. (★†††)log(2.0) の近似値を相対誤差 10−14 以内で計算しなさい. ただし, 「高速」に
計算する方法を考えて計算すること.
Oct. 22, 2014, Version: 1.0
[email protected]