計算環境の精度を当てる ― 解説編 ―
小清水 です。 (@curekoshimizu)
前回の記事は
「計算環境の精度を当てる ― Intel CPU と Excel への応用 ―」というタイトルで、
進 桁浮動小数点環境 の
基数 と 精度 を当てる!
という話でした。 (一部 Excel の謎挙動を紹介)
前回は証明を掲載していなかったため、
今回は証明に主眼をおいて紹介したいと思います。
最初に注意しますが、
は 2以上の整数 とします。
世の中には 「-2 進数」・「1+i進数」・「黄金進数」などというのがあったりもするのですが、
さすがに除外させてください。
(これらが採用された実用的なコンピューターを僕はまだ知りません。)
証明がわかりやすいよう、
記号 を次で定義しておきます:
と定義します。
ただし丸めの方向は環境に決っているものとし、
最もよく使われる「最近接偶数方向丸め」でなくとも構いません。
丸めの方向 、例えば、
最もよく使われる 最近接偶数方向丸め や 0方向丸め などについて知りたい方はココを御覧ください:
3進数3桁の環境でアルゴリズムを振り返りながら+証明
実例があったほうがわかりやすいかと思いますので、 ありきたりな 2進数 ではなく 3進3桁 で考えましょう。
以前紹介していたように、
Step1・2・3 がありました。
Step のそれぞれのアルゴリズムを思い出し、
次にそれを 3進3桁で実例を動かし、
そのアルゴリズムで結局何を実行しようとしているのかとその証明を述べていこうと思います。
Step1. について
と計算していく。
つまり を 進 桁で計算していくということになります。
そして、初めて となる を求めます。
実例でみていきましょう。
Step1 を実例で考える
の 3進3桁表現は です。
の 3進3桁表現は です。
これを続けていくと、
となります。注意としては の次 () は
本来は なのですが、
これは 4桁精度 の表現なので、
3桁精度 に丸める必要があります。
このアルゴリズムは 丸めの方向に言及していない ことから、
近い2つの浮動小数点のどちらを選んでも問題ありません!
つまり候補としては 2つ あり、この例ですと
となります。
ここまで登場した、オレンジ以外の数 を としても
の計算値は 1 になります。
例えば、ピンクの数である、
で詳しくみてみましょう。
ここで 桁あわせを行い
と途中で丸めなのも必要なく、
を正確に表すことができています。
しかしながら、オレンジの 指数3 の数はこうはなりません。
例えば を選択した場合を例にあげると
ここでわかるのは 1 の効果が丸めによって(☆)、復元不能になっていることです。
最終結果は丸めの方向によって、
の2つがでていますが、もとの から見ると
差が 3 または 0 となっています。
すなわち、 1 という 指数0 の項の影響が、 指数1 の世界に持ち上がってしまったというイメージです。
が正しく求められれば、 は当然 1になるのですが、
が真の解からずれてしまうと、もはや で 1 に復元することはできなくなります。
すなわち、 Step 1 からわかることは
3進3桁では で計算が合わなくなるということです。
ここからわかるアルゴリズムの目的と証明
Step1 のアルゴリズム:
と計算していく。
つまり を 進 桁で計算していくということになります。
そして、初めて となる を求めます。
は何を求めるための Step になるのでしょうか。
進 桁表現の環境における、指数表現に属する数 を求めるためのアルゴリズム
実はこれが主張になります。
先程の例でいうと、
- 水色 (指数0型)
- 紫色 (指数1型)
- ピンク色 (指数2型)
を経て、
- オレンジ色 (指数3型)
でちょうど Step1 が停止したのです。
この点を一般の場合でも証明しましょう。
(証明)
< なので < なる自然数を使って
\begin{align*} m = x_{p-1} {\beta}^{p-1} + x_{p-2} {\beta}^{p-2} + \dotsb + x_{0} {\beta}^{0} \end{align*}
と表現できる。
ここで となる最大の添字を とすれば
\begin{align*} m = x_{k} {\beta}^{k} + x_{k- 1} {\beta}^{k- 1} + \dotsb + x_{0} {\beta}^{0} = (x_{k} . x_{k- 1} \dotsb x_0) \times {\beta}^{k} \end{align*}
この Prop 1 から を超えない限り は 進 桁 で丸め誤差なく表現できる。
< であるから である。
< の場合は Prop1 から 進 桁 で表現可能。
そうでない場合は であり
は と表されるので、 進 桁 で表現可能。
よって
< を満たす限り は 進 桁 で正確に表現可能であるから、
となり、
ここから
ということがわかった。つまり、
ということがわかったことになる。
また、
(証明)
この式を変形すると < であり
この区間の端点間の差は
その自然数が存在し、その最小なものが証明する である。
この Prop3 より 自然数 として
< を満たし < となるものがとれる。
この式から
< となり、
< であることから Prop 2から となる。
すなわち であり
< を得る。
である(両者は 進 桁で表現可能な の両端点である。
以上から
ということが示された。
以上から Step1 のアルゴリズムが
進 桁表現の環境における、指数表現に属する数 を求めるためのアルゴリズム
となることは Prop2 と Prop4 から示されたことになります。
Step2. について
であり、この 1 を動かして
と続き、 初めて等号となってしまう 整数 を見つる
つまり、
となる を見つける。
この Step2 から が見つかると
その環境が 進数計算環境であることがわかる
Step2 を実例で考える
先程の 3進3桁 では Step1 により が求まりました。
が 1 にならないことがわかりました。
今度は
や
を計算していこうという話になります。
計算してみるとわかるのですが下のようになります:
(Step1)
これは
3 が 3進3桁で と 指数1 に初めてなる!
ことが関係します。それまでの数は 指数0 型の表現でした。
さきほど成立しなかった理由を思い出すと、
指数0 の数を足しても、桁数をあわせて足しても 3桁でおさまらないため、
丸める必要がありました。
今回は 指数1 なので、桁をあわせて足した数が 3桁でおさまります。
(x+1) がきちんと表現できてしまえばこちらのものです。
以上から、 3 が求められ、
3進3桁の 3進数 が求められます。
ここからわかるアルゴリズムの目的と証明
目的は上でも記載したとおり、基数 を求めることです。
Step1. で であり
<
となるものが得られました。
この数と の足し算は 進 桁で正確に表現できないが、
は であるから は正確に表現可能。
よって となり Step2 で が求まる。
Step3. について
Step3
と計算していく。
そして、初めて となる を求めます。
この が 精度 桁 を表すという主張です。
Step3 を実例で考える + 証明
のとき、
初めて の計算が 1 に一致しなくなります。
これは Step1 と同じ話で、
何が違うかというと、
Step1 は基数が不明だったので、 という形でもって調べる必要がありましたが、
今度は 型なので、第 回で 指数 型になることがわかります。
これが証明であります。
あとは Step1 と同じです。
最後に: が 素数じゃない場合でも?
基数 が素数じゃなくとも、きちんと求まります!
これは Step2 の証明を思い出すとわかります。
ということは
16進法 でもこの基数を当てられる!ということになります。
16 進法といえば 古典的 RISC アーキテクチャである (1970年頃)、
IBM System/370 などに採用されている IBM浮動小数点方式 では
「16進数」を採用していました。
「16進数」は一時期はコンピューターの歴史を彩っていた方式であり、
これを使う機会があれば、
「16進数」である証拠をこのアルゴリズムで確認できます!
以上1万字を超える、浮動小数点を含んだ証明の話でした。
前回の「計算環境の精度を当てる ― Intel CPU と Excel への応用 ―」という記事では、
Excel の謎挙動 を紹介しました。これについては現在も調査中です。
大まかにわかってきたのですが、まとまりましたら紹介したいと思っております!
よろしくお願いします。