高精度計算を用いたポータブルな 精度保証付き数値計算法の研究
Studies on Portable Self-validating Methods with Accurate Computations
2007 年 3 月
早稲田大学大学院 理工学研究科
情報・ネットワーク専攻 情報数理工学研究
尾崎 克久
Katsuhisa OZAKI
目 次
1 序論 3
1.1 はじめに . . . . 3
1.2 IEEE 754が定める倍精度浮動小数点数と誤差解析. . . . 7
1.3 連立一次方程式の数値解に対する精度保証法 . . . . 9
1.4 浮動小数点数のみを用いた高速な高精度計算 . . . . 17
1.5 計算幾何学と行列式 . . . . 18
1.6 本論文の構成 . . . . 22
2 Javaによる連立一次方程式の数値解に対する高精度な精度保証法 23 2.1 はじめに . . . . 23
2.2 準備 . . . . 24
2.3 高精度演算アルゴリズム . . . . 25
2.4 提案手法による精度保証 . . . . 28
2.4.1 従来手法 . . . . 28
2.4.2 提案手法 . . . . 31
2.5 数値実験 . . . . 34
3 Javaによる連立一次方程式の数値解に対し成分毎に高精度な誤差限界を与え る精度保証法 36 3.1 はじめに . . . . 36
3.2 高精度計算に関する表記 . . . . 38
3.3 スケーリングを用いた精度保証法 . . . . 39
3.4 提案手法 . . . . 40
3.5 数値実験結果 . . . . 43
4 計算幾何学に現れる行列式の高速かつロバストな計算法 45 4.1 はじめに . . . . 45
4.2 行列式の変形 . . . . 46
4.3 提案手法 . . . . 48 4.4 数値実験結果 . . . . 52
5 結論 54
1 序論
精度保証付き数値計算はここ10年で急激に発展した分野である.シミュレーショ ンを行う際に,物理現象をモデル化・離散化を経て最終的に数値計算による結果が得 られるが,シミュレーション結果が実際の現象と異なる場合に,精度保証付き数値計 算は数値計算の部分に問題があるのかないのかを明確にすることができ,問題の解決 に貢献できる。また通常の数値計算は,得られた近似解に対しての精度が保証されて いないが,近年の精度保証付き数値計算は実用的な時間で行われ,本来の意味で数値 計算学を確立していると評価され,現在では応用数理学の一分野としての地位を築い ており,連立一次方程式,行列の固有値問題,非線形連立方程式,微分方程式,数値 積分等の様々な分野で発展し続けている.本論文ではJavaで用いることができるポー タブルな連立一次方程式の数値解に対する精度保証法と計算幾何学に現れる行列式の 符号を精度保証付きで計算する高速なアルゴリズムについて述べている.
1.1 はじめに
本研究は精度保証付き数値計算に関連するが,精度保証付き数値計算の原理は区間 解析と関係が深い.1950年代にSunagaにより区間演算が開発された[25].区間により 定義された2つの数に対する4則演算の結果を,また区間により包含する理論であり,
非常に包括的な論文である.その後Mooreが区間解析を学位論文のテーマとし,出版 するにあたり多くの研究者が区間解析に関する研究を行った[26].
浮動小数点数システムを定める規格としてIEEE 754が登場した[1].IEEE 754は
W.Kahanを中心とするグループの提案により1977年から制定作業が開始され,1985
年に承認された.IEEE 754が制定された背景としては,浮動小数点数方式が個々に制 定され,規格として統一する必要があると考えられたことが原因である.規格が統一 され普及されれば,プログラムを別々の計算機で実行した場合にも同じ計算結果を得 るという利点がある.現在ではIEEE 754は多くの計算機に標準搭載されている規格 であり,浮動小数点演算の結果に対する有向丸めが定義され,精度保証を実現する良 い環境が整っている.
この有向丸めを用いて,浮動小数点数により定義された区間型の4則演算の結果を また浮動小数点数による区間で求める機械区間演算が定義された.数値計算により真 の解を包含できるために,直接解法により解を求めるアルゴリズム中の4則演算をす べて機械区間演算に置き換えて精度保証が行われた.例としては連立一次方程式に対 する区間ガウスの消去法がある.ところで区間演算は1回ずつの計算につき有向丸め の変更を行うために非効率な部分があったが,行列乗算の結果の包含には有向丸めを 上向き・下向きに一度ずつのみ変更し,また線形計算に最適化されたBLAS等を利用 できるために非常に効率良く包含することが可能となった.
精度保証付き数値計算を実現する環境としてはMATLABのツールボックスである
INTLAB [24]が有名である.区間型の演算が定義され,行列計算等の包含を高速に行
うことができ,また三角関数や指数関数等の超越関数も区間型を引数とし,結果を区間 により出力する.さらに結果の表示も正しい桁のみを表示するように設計されている.
本論文では連立一次方程式の数値解に対する精度保証付き数値計算法と計算幾何学 に現れる行列式の符号に対して高速に精度保証を行う手法について述べる.まず連立 一次方程式については
Ax=b, A∈Rn×n, b∈Rn (1.1)
と表記され,この形式の連立一次方程式は科学技術計算においてよく扱われる.通常は 計算機に実装されている高速な浮動小数点演算を用いて式(1.1)の解を求めるが,浮動 小数点演算には丸め誤差,桁落ち等の計算誤差が常に起こり,得られた数値解(浮動小 数点演算により得られた近似解)がどれだけ正しいかは疑問である.式(1.1)を解くア ルゴリズムに対して数値解析を行い,アルゴリズムの安定性が論じられ,条件数を用い た式により数値解が持つ誤差の上限を押さえることができたが,その条件数自身を正確 に求めることは浮動小数点数を用いた数値計算ではほぼ不可能である.誤差を理論式 を用いて表現するのではなく定量的に図るには,よく区間演算という技法を用いるが,
通常の近似計算に要する時間の数10倍以上の手間がかかり,また計算ごとに区間幅の 増加を避けられず,誤差半径は次元の増加とともに指数関数的に増えるために満足な 結果を得ることが難しかった.ところが近年,OishiとRumpらはIEEE 754が定める 浮動小数点演算が満たす性質を用いて,求解に要する時間のわずか数倍の手間により
連立一次方程式の数値解の持つ誤差の上限に対する定量的評価を与える画期的な精度 保証法を開発した[2].この論文の中ではさらに,連立一次方程式の数値解に必要な計 算量と同じ手間をかければ,精度保証が行える高速な手法についても述べられている.
即ち連立一次方程式の数値解に対する精度保証法は数値解を求める時間の2倍で行え ることを意味する.その後,連立一次方程式の数値解に対する精度保証法は新たな手 法も誕生した.三角行列の事前誤差評価を用いる新しい誤差公式を作成し,有向丸め の変更を利用して精度保証を行う方法が開発された[3].この手法は高速に精度保証が 可能なときは高速に行い,不可能な場合には時間をかけて精度保証を行う2段階方式 となっている.またIEEE 754が定める浮動小数点演算における丸めの向きを変更しな いポータブルな手法[4]や悪条件な行列を係数に持つ連立一次方程式の精度保証を行う ための手法[5]がある(厳密には悪条件用の手法の基礎理論はRumpにより1980年代 には開発されていたが,この時点では論文化はされていなかった.また最近Rumpに よる悪条件用の近似逆行列の生成法がなぜ上手く機能するかを示す収束証明がOishi,
Tanabe,Ogita,Rumpらによってなされた[22]).本論文ではJavaというポータブル でかつ近年は高速化の技術も発展し,数値計算やシミュレーションにも利用される言 語を用いて連立一次方程式の数値解に対する精度保証付き数値計算を行う.議論のポ イントは,JavaがIEEE 754が定める有向丸めの変更を使用できない点を考慮し,か つ誤差の上限を過大評価しない精度保証法を開発することである.またJava以外に丸 めのモードの変更ができない環境があり,例としてはFORTRAN77がある.またライ ブラリが関数内部で丸めの向きを変更するために,ユーザからの有向丸めの変更命令 が無視される環境もある.このような環境では,丸めモードの変更を必要としない最 近点への丸めのみを用いた精度保証法が必要である.また将来的に全ての計算機環境 において有向丸めが機能するようになったとしても,提案手法はOgita-Rump-Oishiら の精度保証法[4]の誤差半径の過大評価を抑える手法として存在するために,意義を失 わない.
次に計算幾何学に現れる行列式の符号を高速かつロバストに求めるアルゴリズムに ついて述べる.計算幾何学は実社会において幅広く応用を持つ分野であり,凸包・点 とポリゴンの内外判定問題・ボロノイ図等はよく議論の対象になる問題である.これ
らの例を含む応用問題を解くためには,点と直線の位置判定を求めることや点と円の 内外判定を用いるなど,基本的な計算の積み重ねが必要である.従来の計算幾何学の 問題を解くアルゴリズムは,理論上は高速に実行できるように設計されているが,数 値計算による誤差が生じるために正しくない判定結果を利用しながらアルゴリズムが 進行するために,正確な結果を返さないことや計算が無限ループに陥ることが問題と されてきた.そこで数値計算に誤差が起こるのを前提に上手く計算が進むアルゴリズ ムが設計され,数値計算の結果が良いほど求められる結果も比例して良いという方向 性を持った優れたアルゴリズムが開発された[38].
そのために数値計算に求められる期待は高いが,より信頼できる結果を得るために 計算の精度を上げると計算時間は膨大に増える.例えば倍精度浮動小数点数の2倍の精 度を持つような演算をソフトウェアにより仮想的に実装した場合,通常の浮動小数点 演算に比べ30倍から100倍の時間を要すると言われている.そのために多倍長精度の 計算を使用する前に,フィルターと呼ばれる浮動小数点演算のみを用いた行列式の符 号に対する精度保証法を試すことが効率的である.例えば行列式の符号をLU 分解に より求めた後,逆行列を用いて精度保証を行う方式やLU分解自身を区間演算で求める 精度保証方式[30], 逆行列を用いない精度保証方式[31]がある.フィルターは問題が悪 条件な場合には精度保証に失敗することがあり,その場合には高精度な計算に移行す るが,行列式の符号を保証するために必要な精度は問題に依存する.そこでShewchuk は問題を適応的,すなわち問題が簡単な場合には少ない計算時間で,問題が悪条件な 場合には難しさに比例した計算時間をかける形式で,非常に優れたアルゴリズムを設 計した.行列式の符号が保証されるまで,高精度計算を少しずつ用いていく方式であ
り,またShewchukは,ハードウェアによって最適に実行される浮動小数点演算のみを
用いて高精度に計算を行うアルゴリズムを開発した[14].その結果,Shewchukは計算 幾何学に現れる行列式をロバストに計算する際には,従来の多倍長精度計算ライブラ リを用いるよりも浮動小数点演算を用いて高精度に計算を行う方式が高速であること を示した.
数年後にDemmelとHidaは,問題が悪条件な場合に用いられる高精度計算に対して
は,行列式の計算を浮動小数点数の総和を計算する問題に誤差なく変換し,高精度に
ベクトルの総和を計算するアルゴリズムを適用したほうが,Shewchukのロバストなア ルゴリズムより高速であることを示した[13].
本論文の計算幾何学に現れる行列式の符号を保証する高精度かつ高速なアルゴリズ ムに関する議論のポイントは,最近開発されたベクトルに対する総和を計算結果の精 度を保証付きで求めるアルゴリズムを計算幾何学の計算に特化し,問題が悪条件な場 合より高速な形式で提案することである.また,先行研究の優れた結果と合わせて,精 度保証が簡単な問題は高速に,難しい問題は先行研究よりも高速に行列式の符号を求 めることができるようになった.
1.2 IEEE 754 が定める倍精度浮動小数点数と誤差解析
まずIEEE 754 [1]が定める倍精度浮動小数点数について述べる.倍精度浮動小数点
数は64bitで表現されており,仮数部に52bit,指数部に11bit,符号の表現に1bit使用 する.
IEEE 754では,浮動小数点演算において以下の4つの丸めモードを用意している.
• 最近点への丸め(デフォルト)
• +∞方向への丸め
• −∞方向への丸め
• 原点方向への丸め
また2つの浮動小数点数に対する4則演算の際には誤差のない世界で計算してから 浮動小数点数に丸めた結果と,浮動小数点演算を行った結果が一致するように規格が 定められている.また浮動小数点数に対する平方根も,誤差のない世界で計算してか ら浮動小数点数に丸めた結果と浮動小数点演算で求めた結果が一致する.ただし指数 関数や三角関数などはこのような性質を満たすように規定はされていない.
本論文中では計算はIEEE 754規格に定められた倍精度浮動小数点数を用いる.Fを 浮動小数点数の集合とし,fl(·)は括弧中の演算をすべて浮動小数点演算によって実行し たときの結果を表す.たとえば,x, y ∈Fnに対してfl(xTy)は浮動小数点演算によって
計算した内積の値を意味する.また浮動小数点演算を+∞方向への丸めモードにおい て計算するときはfl4(·)と表記し,−∞方向への丸めモードにおいて計算するときは fl5(·)と表記する.有向丸めはベクトルx, y ∈Fnに対する内積計算xTyやA, B ∈Fn×n に対する行列乗算AB 等を下限・上限により包含する際に非常に便利であり,実際に は内積・行列乗算の結果は以下のように包含できる.
fl5(xTy)≤xTy≤fl4(xTy), fl5(AB)≤AB ≤fl4(AB).
これは実数による計算結果は浮動小数点演算による計算を2回行えば包含できること を意味する.上記の計算方式は有向丸めの変更は2回で良く,線形計算ライブラリで
有名なBLASやLAPACKにより最適化された高速な関数をそのまま用いられるので
非常に効率が良い.同じ包含を行う手法として区間演算という手法があるが,区間演 算は1回の計算ごとに有向丸めの向きを変更するために,上記の包含方法に比べて効 率的ではない.浮動小数点演算において,アンダーフローは起きないと仮定する1.ま たu を浮動小数点演算の相対精度(unit roundoff)とする2.
次に,本論文で利用する有向丸めを用いずに誤差の上限を求めるための関係式を以 下に紹介する[4].a, b∈F に対して
|a+b| ≤ (1 +u)fl(|a+b|) (1.2) (1 +u)n|a| ≤ fl
µ |a|
1−(n+ 1)u
¶
(1.3) が成り立つことが知られている.また,x, y ∈Fn に対して
kxk∞ = fl(kxk∞) (1.4)
|xT||y| ≤ fl
µ |xT||y|
1−(n+ 1)u
¶
(1.5)
|xTy| ≤ |fl(xTy)|+ fl(eγn,2n+2|xT||y|) (1.6) が成立することが知られている.ただし,m, n∈N に対して eγm,nを
e
γm,n := fl
µ mu 1−nu
¶
(1.7)
1アンダーフローを考慮しても議論は大きくは変わらない.
2IEEE 754倍精度では,u= 2−53 となる.本論文では一番大きい次数の項のみを表記する.
と定義し,行列とベクトルに対する絶対値は,すべての成分に絶対値をつけたベクトル
·行列を意味する.また,ベクトルと行列の最大値ノルムについては,x= (x1, . . . , xn)T 及びA= (aij)∈Fm×n に対して
kxk∞ := max
1≤i≤n|xi|, kAk∞ := max
1≤i≤m
Xn
j=1
|aij| (1.8)
である.
1.3 連立一次方程式の数値解に対する精度保証法
精度保証付き数値計算の分野では近年,OishiとRumpによって連立一次方程式の数 値解に対する高速な精度保証法が提案された[2].Oishi-Rumpの方法では,式(1.1)の 近似解をex,Aの近似逆行列をR,I を n×n 単位行列とすると
kRA−Ik∞<1 (1.9)
を証明できた場合に
°°A−1°
°∞≤ kRk∞
kRA−Ik∞ (1.10)
が成立し
kex−A−1bk∞≤ kR(Aex−b)k∞
1− kRA−Ik∞ (1.11)
という誤差評価式を用いて精度保証を行っている.ここで(1.11)の右辺の計算を前節
で述べたIEEE 754有向丸めを適宜変更しながら計算することで誤差の上限を求める
ことができる.実際にkRA−Ik∞の上限は
kRA−Ik∞≤ kmax(|fl5(RA−I)|,|fl4(RA−I)|)k∞ (1.12) と求められる.浮動小数点演算の回数をflops(floating point operations)と表記すると,
連立一次方程式を精度保証付き数値計算で行う場合は近似逆行列を求めるのに2n3flops 必要であり,また2n3flops必要な行列乗算RAを+∞方向への丸めモードと−∞方向 への丸めモードにより計算するために,全体で6n3flopsの計算量が必要となる.係数 行列が密行列である場合によく近似解法として用いられるLU分解法に必要な計算量
は2/3n3flops であることから,精度保証付き数値計算は近似計算の9倍の手間をかけ れば実行可能なことを意味する.また係数行列に何も制約をつけない場合において最 も高速な連立一次方程式の数値解に対する精度保証法はOishiとRumpにより開発さ れた[2].P ∈Fn×nを置換行列とした軸交換付きLU分解
P A≈LˆUˆ
を利用し,L, Uの近似逆行列をそれぞれXL, XUとしたときに式(1.11)は
°°ex−A−1b°
°∞≤ kXU ·XL·P(Aex−b)k∞
1− kXU ·XL·P ·A−Ik∞ (1.13) と変形できる.ここでL, Uの近似行列をL,ˆ Uˆ としγnを
γn:= nu 1−nu と定義すると
kXU·XL·P ·A−Ik∞≤γ2n
°°
°|XU||XL||P||L||ˆ Uˆ|
°°
°∞+γn
°°
°|XU||Uˆ|
°°
°∞ (1.14) であることが証明される.上式は三角行列をW,W に対する近似逆行列XW を消去 法によって計算された場合には以下の不等式
|XWL−I| ≤γn|XW||W|
が成立し,この関係式を用いて得られる(三角行列における逆行列計算の事前誤差評 価と言われている).また行列X, Y ∈Fn×nに対しては
k|X||Y|k∞ =k|X|(|Y|e)k∞, e= (1,1, . . . ,1)T ∈Fn
という関係を利用することにより,式(1.14)における右辺の評価をそれぞれ γ2n
°°
°|XU||XL||P||L||ˆ Uˆ|
°°
°∞ =γ2n
°°
°|XU|(|XL|(|P|(|L|(|ˆ Uˆ|e))))
°°
°∞, γn
°°
°|XU||Uˆ|
°°
°∞=γn
°°
°|XU|(|Uˆ|e)
°°
°∞
と評価することにより次元の2乗に比例する計算量で実行できる.この精度保証法は 三角行列L, Uに対する逆行列の計算に要するコストが大部分を占め,合計の計算量は
2/3n3flopsとなるために,数値解を求めるための近似計算と同じコストをもう一度か けると誤差の上限が求められる高速な精度保証法である.
また荻田と大石により,上記の最も高速な精度保証法よりも扱える問題の幅が広い 精度保証法も開発された[3].
°°ex−A−1b°
°∞≤ kXUXLP(Aex−b)k∞
1−(kXLP A−Uˆk∞+γnkUkˆ ∞)kXUk∞ (1.15) という評価を行う.ここで
°°
°XLP A−Uˆ
°°
°∞の上限は+∞方向への丸めモードと−∞
方向への丸めモードを用いて
°°
°XLP A−Uˆ
°°
°∞ ≤
°°
°max(fl5(|XLP A−Uˆ|),fl4(|XLP A−Uˆ|))
°°
°∞ (1.16) と計算され,精度保証に必要な計算量は8/3n3flopsとなる.この方式は2段階方式で 提案されており,はじめに式(1.13)を用いた精度保証を実行し,精度保証が失敗した
場合は式(1.16)を用いて精度保証を行う形式となっている.式(1.13)の方式に必要な
計算量はXLとXUを求めた後はO(n2)flopsのみであるために,失敗した場合の時間 のロスも無視できるほどに小さいために有効な2段階方式になっている.
またOgita,Rump,Oishiらにより,有向丸めを用いず,最近点への丸めのみを用いた
浮動小数点演算により誤差の上限を求める精度保証法が開発された.実際にkRA−Ik∞ の上限は
kRA−Ik∞≤fl
µα1+ fl(eγ3n+2(α2+ 2)) 1−2u
¶
と計算される.ここでα1,α2は
α1 := fl(kRA−Ik∞), α2 := fl(k|R|(|A|e)k∞)
と計算される.また精度保証式の分子であるkR(Ax−b)k∞の上限は rmid := fl(Aex−b), rrad := fl(eγ2n+4(|A||x|+|b|))
としたときに,以下の関係式により求められる.
kR(Ax−b)k∞ ≤fl
µRrmid+q 1−2u
¶
ここで上式にあるq,tは q:= fl
µ|R|(t+rrad) 1−(n+ 3)u
¶
, t:= fl(eγn+1|rmid|)
と定義する.精度保証の計算においては逆行列,行列乗算に時間を要するが,有向丸 めを用いる方式が行列乗算を2回行うのに対し,有向丸めを用いない形式方式は行列 乗算が1度のみであるので高速である.ただし,有向丸めを用いた手法よりも扱える 問題の幅が狭く,誤差の上限を過大評価する傾向にある.
計算量と計算時間は一概には比例しないことが良く知られている.例えば逆行列を 求める際に必要な計算量は一般に2n3flopsと言われるが,分割倒置法を繰り返し適用 するとおよそnlog27に比例する計算量まで削減できる.ただし再帰アルゴリズムの複雑 さやオーバヘッド等が原因で次元が低いときには高速にならないことが知られている.
即ち,flopsで示される量が小さい場合でも,多くの計算時間を要してしまうこともあ る.ただし,これまでに紹介した連立一次方程式の精度保証法はすべてBLAS等で最 適化された高速な関数をそのまま使用するために計算時間は計算量にほぼ比例し,高 速に実装が可能な手法である.ここで実際に各手法の計算時間を計測した時間を示す.
計算機環境として,CPUはPentium M 1.7GHz,ソフトウェア環境としてはMATLAB 7.1を用いて以下の手法に要した計算時間を比較する.
• 手法A 式(1.13)による精度保証法[2].
• 手法B 式(1.15)による精度保証法[3].
• 手法C 式(1.12)による精度保証法[2].
表1は上記の手法に要した時間を表し,その結果からほぼ計算量に比例した計算時 間がかかることがわかる.
係数行列が悪条件である連立一次方程式に対する精度保証法は太田·荻田·大石·Rump らにより開発された[5].係数行列が悪条件な場合には,kRA−Ik∞ < 1を満たすよ うなAの近似逆行列Rを得ることが難しい.この問題に対し,従来の多倍長精度計算 を用いてRを高精度に求めることは可能であるが,膨大な計算時間を要する.また,
kRA−Ik∞ < 1を満たすために用意する精度は条件数等に依存するために,事前に
表 1: 各手法に要する計算時間の比較(秒).
n A B C
1000 0.74 2.47 4.53 2000 5.08 18.84 36.39
はわからないことも問題となる.そのために,Rumpは浮動小数点演算のみを用いて kRA−Ik∞を満たすRを適応的に求めるアルゴリズムを開発した.Rを複数の浮動小 数点数の和
R=R1+R2+R3+. . . で表現し,このようなP
Riを求めるためにkRA−Ik∞<1を満たすまで以下の計算
• C =RA
• T = inv(C)
• R1,2,3,...,k =T R
を繰り返して計算する.保持する行列の個数kは,行列の条件数の大きさに依存し,適 応的に増えていく.ここでC = RAに対しては高精度な計算を用い(Cの計算結果は 1つの浮動小数点数による行列),R =T Rの計算では高精度な計算を用い,結果を複 数のRの和として保存する.太田らはここで用いる高精度な計算を近年開発された浮 動小数点数のみを用いた高速かつ高精度な内積の計算法[8]により実装し精度保証を 行った.
精度保証を行う際に使用するメモリを削減する方式も提案されている[27].通常密 行列を係数行列とする場合には係数行列,LU分解による上三角行列・下三角行列,近 似逆行列を保持する必要があり,また途中の計算に対してもワークメモリが必要なた めに,精度保証は係数行列の格納に必要なメモリの数倍必要であることから,大規模 な行列を扱うときに問題となる.この手法では係数行列の格納に必要なメモリの約2 倍のみのメモリを用いて節約するが,最適化が優れているLebel 3のBLASを可能な 限り用いて精度保証を行っており,ブロック化のサイズによる計算時間の比較が論文
に書かれている.メモリを節約しない場合に比べて速度は低下するが,約3割程度の 計算時間の増加により抑えられている.
また連立一次方程式の数値解の1つ1つの要素に対し誤差上限を与える精度保証法,
すなわち成分毎の精度保証法も開発された.成分毎に精度保証を行うための有効な関 係式は1980年代にYamamotoにより開発された[6].式(1.1)の近似解をx,Ae の近似 逆行列をR,I を n×n 単位行列とすると
|ex−A−1b| ≤ |R(Aex−b)|+ kR(Aex−b)k∞
1− kRA−Ik∞κ (1.17) が成立する.ここでκ≥
à n X
j=1
|G1j|, . . . , Xn
j=1
|Gnj|
!
, G=RA−Iとする.ただし,ベ クトル v = (v1, . . . , vn)T に対して |v| を |v|:= (|v1|, . . . ,|vn|)T と定義し,ベクトルに おける不等式は各成分ごとに不等式が成立することを意味する.また,行列に対して も同様の表記を用いる.この手法に必要な計算量は6n3flopsであり,連立一次方程式 の数値解の持つ誤差の上限をノルムにより評価する式(1.11)と同様の計算量で実行で きることがわかる.
その後Ogita,Oishi,Ushiroらにより誤差上限の過大評価を抑える精度保証法が開
発された[7].式(1.1)の近似解をx,Ae の近似逆行列をR,r :=Aex−b,ezをAez =r の近似解とすると,
|ex−A−1b| ≤ |ez|+kA−1k∞kAez−rk∞e (1.18) が成立する.ここでe= (1, . . . ,1)T ∈Rnとし,kA−1k∞の上限は式(1.10)から求める.
式(1.18)における第2項のkA−1k∞kAez−rk∞eの値が大きい場合は,絶対値の小さな 成分に対しても大きな成分に対しても同じ誤差限界が加えられるために,成分毎に良 い誤差限界を与えているとはいえないが,kAez−rk∞ を小さくできるために,第2項 の過大評価を抑えて成分毎に良い誤差限界を与えるように設計されている.計算量は 6n3flopsとなり,式(1.17)に要する計算量とほぼ同じである.
このように連立一次方程式の数値解に対する精度保証法は様々な方式で開発されてき たが,基本的に計算コストと扱える問題の幅にはトレードオフがある.高速な手法は次 元や条件数が高い場合には精度保証に失敗しやすくなり,コストをかける手法ほど次元
102 104 106 108 1010 1012 1014
MethodA MethodB MethodC
Fig. 1: kRA−Ik∞の上限の比較.
や条件数が高くても精度保証に成功する傾向にある.ここで各手法におけるkRA−Ik∞ の上限を比較する.
Fig.1は以下の手法
• 手法A 式(1.13)による精度保証法[2].
• 手法B 式(1.15)による精度保証法[3].
• 手法C 式(1.12)による精度保証法[2].
を実行した結果であり,係数行列はMATLABのgalleryにあるrandsvdを用いて,1000 次元の行列を生成した(特異値の分布モードは3とした).表1からコストが少ない手 法ほど,kRA−Ik∞の上限が1を超えやすく,コストをかける手法ほど,高い条件数 の問題まで精度保証が可能となることがわかる.
また係数行列が特殊な構造を持つときには,その特殊性を考慮した高速な精度保証 法が提案されている.係数行列が対角優位であれば不動点定理に基づいた手法が提案 されている[34].係数行列Aを対角行列D,対角成分が0である上三角行列AU,対角
成分0である下三角行列ALを用いてA=D+AU +ALとしたときに,真の解xと近 似解xeの間の誤差上限は以下の式により抑えられる.
kex−xk∞ ≤ 1 1−q
°°ex+D−1(AL+AU)ex−D−1b°
°∞.
ここでq =kD−1(AL+AR)k∞であり,O(n2)flopsで誤差の上限が計算できる(対角優 位という仮定よりq <1は満たされ,精度保証は成功する).
係数行列が対称の場合にLDLT 分解を用いる精度保証法が開発された[7].逆行列の 最大値ノルムの上限値を,固有値に関する定理から求めて精度保証を行う手法である.
近似計算に要する時間よりも高速に精度保証が行える場合もあることが示されている.
また係数行列が単調行列な場合に用いる精度保証法も開発されている[11].単調行 列の逆行列A−1の最大値ノルムの上限は,s=Aey−e, ey∈Fnとしたときに
°°A−1°
°∞ ≤ keyk∞ 1− ksk∞ と抑えられる.ここでA−1の最大値ノルムを以下の不等式
kex−xk∞≤°
°A−1°
°∞kAex−bk∞
に代入することで,精度保証が可能となる.精度保証が成功するにはksk∞<1でなけ ればならないためにeyはAy =eの近似解として与えられる.
また従来の精度保証では近似解・近似逆行列の計算に直接解法を用いていたが,反 復解法を用いた精度保証法も開発された[28].近似逆行列を一度に全て求めずに,n回 の連立一次方程式の求解に帰着させて近似逆行列を行単位に求める方式でその処理は 並列計算にも向いている.
係数行列が対称正定値な行列であれば近似解を求める際に用いるコレスキー分解の
後にO(n2)flopsで精度保証が行える手法が開発された[10].数値解を得るために必要
な計算量と比べて精度保証に必要な計算量はほぼ無視できるために,あたかも数値計 算に要する時間のみで精度保証ができるという優れた手法である.
このように連立一次方程式の精度保証法は係数行列に何も制約をつけない場合・係 数行列が特殊な構造を持つ場合・用いるメモリを削減して実行する場合など多角的に 議論がされている.
1.4 浮動小数点数のみを用いた高速な高精度計算
本節では,本論文中に用いる浮動小数点演算を用いた高精度計算について紹介する.
浮動小数点演算により良い精度を持つ結果を得ることの難しさを表す指標として条件 数があり,x, y ∈Fnとしたときに,ベクトルの総和に対する条件数は
cond(X xi) =
P|xi|
|P xi| と定義され,またベクトルの内積は
cond(xTy) = 2|xT||y|
|xTy|
と定義される.例えば,IEEE 754による倍精度浮動小数点数を用いた場合,条件数が 1016を超える問題では,浮動小数点演算による結果はほとんど正しい桁をもっていな いことが問題となる.
計算機によるベクトルの総和や内積といった基本的な計算を高速かつ高精度に行う アルゴリズムについては昔から多くの議論があったが,近年,浮動小数点演算による 高速かつ高精度なベクトルの総和及び内積計算をOgita-Rump-Oishi[8],Rump-Ogita-
Oishi[9]らが開発した.この手法はソフトウェアにより仮想的に浮動小数点数の仮数
部・指数部を拡張して計算する方式ではなく,ハードウェアが通常サポートする浮動 小数点演算のみを用いて高精度な計算結果を得る手法である.特徴として
• 仮数部や指数部への直接的な参照を必要としない.
• 計算機環境に依存しない.
• メインループに分岐がないためにコンパイラが最適化しやすい.
• 入力されるデータに対してソートの必要がない.
• 誤差評価に対する証明を行っている.
といった非常に優れた性質を持つ.結果として現在主流として使用されているライブ ラリよりも高速に実行されることが知られている.ここで,ある自然数Kに対して,
あたかも使用している浮動小数点数のK倍の精度で計算した結果を通常の精度に丸め たような結果が得られるDotKと呼ばれるアルゴリズム[8]とベクトルの総和に対す る計算結果がfaithful3であることを保証するAccSumと呼ばれるアルゴリズム[9]があ る.解きたい問題の条件数がはじめからわかる問題であれば,使用する精度を決めて 高精度計算を行うことも可能だが,わからない場合には精度を決められない問題があ る.AccSumは悪条件な問題に対しても精度が保証されるまで自動的に反復を繰り返 す手法であるために,この問題点に対し何も心配はいらず,速度面に関しても優れて いることが示されている.これらの高精度な計算法はこれより本論文で述べる手法に おいて核としての役割を担う.
1.5 計算幾何学と行列式
計算幾何学は実社会において幅広く応用される分野である.点とポリゴンの内外判 定・凸包・ボロノイ図等は特に話題になるテーマである.従来の計算幾何のアルゴリ ズムは理論的には確実に問題の解を求めることができるが,計算機による誤差を前提 としていないためにアルゴリズムが暴走することもあった.この問題点を解決するた めに問題を整数演算のみに変換する整数帰着法や,誤差を前提にしてもアルゴリズム が正しく機能する位相優先法などが開発されてきた[38].応用問題を解く際には,点 と直線の位置関係・点と平面の位置関係・点と円の内外判定・点と球面の内外判定問 題等はよく基本として用いられるが,それぞれ低次元の行列式に帰着されることが知 られている.
例えば2次元平面上における点と直線の位置関係については,2点(ax, ay),(bx, by)か ら生成される直線と点(cx, cy)の位置関係は以下の行列式
¯¯
¯¯
¯¯
¯
ax ay 1 bx by 1 cx cy 1
¯¯
¯¯
¯¯
¯
の符号により判定される.また3次元空間上における点と平面の位置関係では 3点
3誤差を含まない正確な結果を隣り合うどちらかの浮動小数点に丸めたもの.
(ax, ay, az),(bx, by, bz),(cx, cy, cz)による平面と点(dx, dy, dz)の位置関係は以下の行列式
¯¯
¯¯
¯¯
¯¯
¯
ax ay az 1 bx by bz 1 cx cy cz 1 dx dy dz 1
¯¯
¯¯
¯¯
¯¯
¯
の符号により判定される.また 2 次元平面上における点と円の内外判定では 3 点 (ax, ay),(bx, by),(cx, cy)により定義される円と点(dx, dy) の内外判定は以下の行列式
¯¯
¯¯
¯¯
¯¯
¯
ax ay a2x+a2y 1 bx by b2x+b2y 1 cx cy c2x+c2y 1 dx dy d2x+d2y 1
¯¯
¯¯
¯¯
¯¯
¯
の符号により判定される.また3次元空間上における点と球面の内外判定では 4点 (ax, ay, az),(bx, by, bz),(cx, cy, cz),(dx, dy, dz)により定義される球面と点(ex, ey, ez)の内 外判定は以下の行列式
¯¯
¯¯
¯¯
¯¯
¯¯
¯
ax ay az a2x+a2y+a2z 1 bx by bz b2x+b2y+b2z 1 cx cy cz c2x+c2y+c2z 1 dx dy dz d2x+d2y+d2z 1 ex ey ez e2x+e2y +e2z 1
¯¯
¯¯
¯¯
¯¯
¯¯
¯
の符号により判定される.これらの計算幾何学の判定問題に対し,符号の精度保証付 き数値計算が考えられてきた.通常,行列式を求める数値計算法としてはLU分解を 利用する方法が有力であり,LU分解を利用した精度保証法が開発された.例えば[30]
ではAの部分軸交換LU分解を
P A≈LˆUˆ
とする( ˆL,Uˆ はL,Uの近似行列).またL,U の近似行列をXL,XU としたときの近 似逆行列を
R :=XUXLP としたときに
kI−RAk∞<1
が示せた場合は,行列式の符号は
sign(det(A)) = det(P)Πsign(ˆui,i) と保証されることが示されている.
また上記の手法が提案されている論文には同時に区間演算を使用する精度保証法も 紹介されている.部分軸交換付きLU分解法を機械区間演算により求め,U のすべて の対角成分の区間に0が含まれていなければ,置換行列の行列式とUの対角成分のす べての積を考慮すれば,行列式の符号は保証される.このような区間演算を使用する 手法は与えられる行列の次元が高いときには精度保証に失敗しやすいが,計算幾何学 の問題は低次元の行列を扱うことも多いので,応用可能である.
また区間型を用いた別の精度保証法も提案されている[31].部分軸交換LU分解を P A ≈ LˆUˆ とし,LとU の近似逆行列をXL,XU とすると,Aに対する行列式dは
INTLABを用いて以下のステップにより精度保証付き(区間)で求まる.
B =XL∗intval(P ∗A)∗XU; M = mid(diag(B));
G= midrad(M,abss(X
(B−diag(M),2)));
d= prod(G)/prod(intval(diag(XU)))/det(P);
上記の手法は区間ガウスの消去法よりもはるかに高い次元まで精度保証が可能である.
また,LやU の近似逆行列を求めずに精度保証を行う手法も提案され,以下の不等 式が成立した場合に行列式の符号が保証される[31].
|det(U)|> n2e∗D+.
ここでe∗ =γnmaxi,j(|L| · |U|),D+ = Πnk=1(kA(:, k)k2+ne∗)と定義される.
これまで紹介した行列式の符号に対する精度保証付き数値計算法は係数行列が悪条 件な場合には精度保証が失敗することがある.ここで係数行列が悪条件であるという ことは,点と平面の位置関係の判定問題では点が平面上に非常に近い位置に存在する
ことを意味する.この場合には浮動小数点演算により正しい判定が行われないことが ある.そこで,このような悪条件な場合にも精度保証を行う手法が開発されてきた.
線分と線分の交差判定問題に現れる計算を除算のない形式で与え,整数演算を用い て計算に誤差を起こさない方式が提案された[33].計算に割り算がない場合には,整 数演算に必要な精度を用意すれば無誤差で計算ができるために必ず判定は正しくでき
る(幾何的な問題点にも触れ,全体的に矛盾のない手法を提案している).この手法は
点とポリゴンの内外判定に対する偶奇テスト法に応用され,正しい結果が得られるよ うに提案されている.
はじめから多倍長計算を用いると,通常の浮動小数点演算で間違わない判定ができ る問題にまで計算時間をかけるために,非効率な部分があり,問題を適応的に解く手 法が開発された[14].手法を複数用意し(判定問題により用意する手法の数は異なる),
計算量の少ない精度保証法から順に試していく方式である.簡単に行列式の符号が保 証される場合には少ない計算時間で,問題が悪条件な場合には問題の難しさに依存し た計算時間をかけて精度保証が実行されるために優れている.そのためにShewchukは 独自の浮動小数点数を用いた高精度な計算方法を定義し高速に各手法を作成した.そ の結果,多倍長精度を用いた計算法よりも高速に実行されることを示している.
またDemmelとHidaは点と平面の位置関係に対して問題が悪条件な場合にShewchuk
の手法より高速に行列式の符号を保証する手法を開発した[13].与えられる行列式を 浮動小数点数の総和に誤差なく変換し,高精度にベクトルの総和を計算するアルゴリ ズムを適用する方法である.この手法は入力データにソートが必要であり,また拡張 倍精度浮動小数点数を利用する.一般にソートは時間のかかる作業であるが,浮動小 数点数の指数部によるソートが高速に機能することと,拡張倍精度を用いた計算は近 年の計算機環境において高速に実行できるために,優れた手法であることが知られて いる.
計算幾何学において,入力に誤差がある場合の判定法も開発された[32].例えば線 分と線分の交差判定において,線分を構成する2点の座標それぞれに誤差がある場合 にも正しく判定を行うという手法である.ただし,点の座標に誤差半径が与えられた 場合には点は誤差半径内を自由に動くために,点の位置により線分が交差する・しな
いと変わることがある.そのために
• 入力に誤差がある場合にも必ず線分と線分は交差する.
• 入力に誤差がある場合にも必ず線分と線分は交差しない.
• 入力に誤差がある場合には判定不能.
のいずれかを出力する形式で提案されている.また入力誤差がある場合の凸胞やボ ロノイ図の扱いについても応用されている.
1.6 本論文の構成
この論文では今までに作成してきた論文をまとめる.第1章では第2章・第3章・第 4章での準備を行う.第2章ではJavaで実装可能なポータブルな連立一次方程式の数 値解に対する精度保証法について述べる.誤差上限の過大評価を抑制するために,適 宜高精度計算を用いた.第3章では連立一次方程式の数値解に対して,従来手法では 近似解の絶対値の大きさに差がある場合,絶対値の小さな数値解の成分に対しては良 い相対精度を保証することができない点について,ポータビリティを保ちながら改良 した手法について述べる.第4章では計算幾何学に現れる「点と平面の位置関係」を 判定する高速なアルゴリズムについて述べる.第5章では結論を述べる.
2 Java による連立一次方程式の数値解に対する高精度な 精度保証法
概要
Javaは近年の最適化技術などによって数値計算や数値シミュレーションを行う言語 としても注目されてきている.従来の連立一次方程式の数値解の精度保証法は浮動小 数点演算の丸めモードの変更を必要とするが,JavaではIEEE 754規格で定められてい る丸めモードの変更がサポートされていない.そこで本報告では丸めモードの変更を 必要としない連立一次方程式の数値解の高速かつ高精度な精度保証法を提案する.最 後に,数値実験によって提案手法の有効性を示す.
2.1 はじめに
本章では,連立一次方程式(1.1)における数値解の精度保証をJavaにおいて実行す る方法について考える.ここで,数値解とは計算機によって得られる近似解のことで あり,精度保証とは厳密解に対する近似解の定量的誤差評価のことを指す.
JavaはOS等に依存しないポータブルな言語であり,一度実装すれば異なるプラッ トフォームにおいて同一の結果を得ることができる.従来,Javaは数値計算の分野に おいては処理速度の点で問題視されていたが,近年のJust-In-Time (JIT)コンパイラ
やHot Spot VM等の最適化技術により,その点もかなり改善することが可能となって
きた[36].したがって,Javaは数値計算や数値シミュレーションを行う言語としても注
目されてきている[16, 35, 37].しかしながら,一方ではJavaにおける数値計算の様々 な問題点も指摘されている[18].
連立一次方程式の分野において代表的な手法であるOishi-Rumpの方法[2]では「+∞
方向への丸め」及び「−∞方向への丸め」を用いている.ところが,現在のJavaにおけ る浮動小数点演算の規格では,丸めモードの変更が定められていない.そのため,Java で丸めモードの変更を実装するには,C言語などで丸めモードの変更を行うライブラ リを生成し,Java Native Interface (JNI)を用いなければならない.しかしながら,他
言語で生成したライブラリを用いると,Javaの大きな利点の1つであるソースコード のポータビリティ(アーキテクチャ,OS,コンパイラなどに依存しない)が失われてし まう.Javaのポータビリティを保持するためにはデフォルトの丸めモードである「最 近点への丸め」のみで精度保証を行う必要があるため,従来の丸めモードの変更を必 要とする精度保証法を用いることができない.
これに対し,浮動小数点演算の事前誤差評価を用いて丸めモードを変更せずに最近 点への丸めのみで高速に連立一次方程式の数値解を精度保証する手法をOgitaらが提 案している[4].本論文ではその手法を拡張し,高精度内積計算アルゴリズム[8]を用い た新しい手法を提案する.これによりJavaのポータビリティが損なわれない上に,精 度保証が失敗しない限り,従来の手法よりも数値解の持つ精度をできるだけ過大評価 することなく保証することが可能となる.本章の最後では,数値実験によって提案手 法の有効性を示す.
2.2 準備
本節では,本章で用いるJavaの浮動小数点システム[17]について簡潔に説明をする.
Javaでは浮動小数点数にIEEE 754の単精度及び倍精度の表現形式を用いている.デ フォルトの丸めモードはIEEE 754の最近点への丸めモードであり,Java単独では丸め モードの切り替えが出来ない.またIEEE 754は浮動小数点演算の計算過程において,
単精度もしくは倍精度を超えた拡張精度での内部演算を認めている.拡張精度に関し てはCPUに依存するため,浮動小数点演算の結果が異なることがある.現在のJava における浮動小数点演算の規格では,この拡張精度で内部演算を行うwidefpモードが デフォルトとなっている.ただしJavaのstrictfpモードを使用すると,拡張精度を用 いずにすべてIEEE 754の単精度及び倍精度で演算が行われる.そのためstrictfpモー ドを用いて得られる演算結果はCPUに依存しないためポータビリティを持つ.
2.3 高精度演算アルゴリズム
本節では,提案する精度保証法において用いる内積や行列・ベクトル積の高精度演 算について述べる.
まず,浮動小数点演算の加算及び乗算に対する誤差の計算方法について説明する.こ れらは,内積計算や行列・ベクトル積を高精度に計算するアルゴリズムの中で用いる.
Knuthは2つの浮動小数点数の和a+bを近似値xと誤差yの和x+y (x, y ∈F)に変 換するアルゴリズムを提案している[19].このとき,a+b =x+y が厳密に成り立つ.
そのアルゴリズムを以下に記す.本報告中のアルゴリズムはコード記述の簡略化のた
めにMatlabに似たコードで記述する.
アルゴリズム 1 (Knuth [19]) a, b∈Fに対してa+bの近似値xとその誤差y (x, y ∈ F)を求めるアルゴリズム.
function [x, y] = TwoSum(a, b) x= fl(a+b)
z = fl(x−a)
y= fl((a−(x−z)) + (b−z))
2
次にDekkerによる仮数部がpビットの浮動小数点数aに対しs =dp/2eとし上位s ビットに対応するxと下位p−sビットに対応するy (x, y ∈F)に誤差なく分解するア ルゴリズム[15]を以下に記す4.
アルゴリズム 2 (Dekker [15]) a ∈Fに対して,仮数部がpビットである浮動小数点 を上位s =dp/2eビットに対応するxと下位p−sビットに対応するy (x, y ∈F)に分 解するアルゴリズム.
function [x, y] =Split(a)
c= fl(factor·a) % factor= 2s+ 1 x= fl(c−(c−a))
y = fl(a−x)
2
4たとえば,IEEE 754倍精度の場合,p= 53,s= 27となる.
上記アルゴリズムを利用して,DekkerとVeltkampは2つの浮動小数点数の積a·b をその近似値xと誤差y (x, y ∈ F)の和に変換するアルゴリズムを提案している[15].
このとき,a·b =x+y が厳密に成り立つ.そのアルゴリズムを以下に記す.
アルゴリズム 3 (Dekker [15]) a, b∈Fに対しa·bの近似値xと誤差y(x, y ∈F)を求 めるアルゴリズム.
function [x, y] = TwoProduct(a, b) x= fl(a·b)
[a1, a2] = Split(a) [b1, b2] =Split(b)
y= fl(a2·b2−(((x−a1·b1)−a2·b1)−a1·b2))
2
ここで上記アルゴリズムを実行する際には,IEEE 754で定められた浮動小数点数の 規格で厳密に計算される必要がある.CPUによる拡張精度で計算を行うとアルゴリズ ムが正常に機能しないことがあることに注意をしておく.またコンパイラの最適化に より,アルゴリズム中の括弧をはずして計算されると正常に機能しないことにも注意 をしておく.
上記アルゴリズムを用いてOgitaらはハードウェアでサポートされている通常の浮 動小数点演算,特に,加減算及び乗算のみを用いて内積計算を高速かつ高精度に行う 手法を提案している[8].これはTwoSumやTwoProductにより得られる誤差を計算値に 還元していく手法であり,実行レベルでの最適化に優れていることから高速に行える ことが示されている.また高精度計算アルゴリズムによって計算された値に関する誤 差解析が行われている.その誤差解析の結果から,使用している精度のk倍精度で計 算を行い,元の精度に丸めた結果が得られることが知られている.その中で,提案手 法で用いるアルゴリズムDot2Errを以下に記す.Dot2Errは,使用している精度に対 してその倍の精度(倍精度であれば4倍精度)で内積を計算し,その計算値と誤差の上 限を返す関数である.
アルゴリズム 4 (Ogita-Rump-Oishi [8]) x, y ∈Fnに対し,内積xTyを2倍の精度
で計算したときの計算値res ∈Fと誤差の上限err ∈Fを求めるアルゴリズム.
function [res,err] =Dot2Err(x, y)
if 2nu≥1, error(’inclusion failed’), end [p, s] = TwoProduct(x1, y1)
e=|s|
for i= 2 : n
[h, r] =TwoProduct(xi, yi) [p, q] = TwoSum(p, h) t = fl(q+r)
s= fl(s+t) e= fl(e+|t|) end
res= fl(p+s)
δ = fl((nu)/(1−2nu)) α = fl(u|res|+δe) err= fl(α/(1−2u))
2
表2は,各成分が [−1,1]の一様乱数であるベクトル x, y ∈Fn に対して nを10から 10000まで変化させて Dot2Err を用いたときの,相対誤差 err/|res| の値である.数 値実験ではJavaのstrictfpモードで倍精度を使用した.
この結果から,内積計算における誤差の上限を相対的に非常に小さく計算できること がわかる.
次に,アルゴリズム 4 (Dot2Err)を行列とベクトルの積に適用できるように拡張し,
A∈Fn×n,x∈Fnに対して
y−r≤Ax≤y+r (2.1)
表 2: 乱数ベクトルに対するDot2Errの相対誤差 n err/|res|
10 1.12e-16 100 1.12e-16 1000 1.12e-16 10000 1.12e-16
を満たすような 中心y, 半径r(y, r∈Fn)を求めるアルゴリズムを以下に記す.
アルゴリズム 5 A∈Fm×n, x∈Fn に対しy−r ≤Ax≤y+r を満たす Ax の近似ベ クトル y と誤差ベクトルr (y, r ∈Fn)を求めるアルゴリズム.
function [y, r] =MVErr(A, x) [m, n] =size(A) % m行n列 for i= 1 :m
w=A(i,:)
[yi, ri] = Dot2Err(wT, x) end
2
2.4 提案手法による精度保証
本節では,Javaにおいて連立一次方程式の数値解の精度保証をするために,丸めモー ドの制御なしで行う高速かつ高精度な精度保証法を提案する.
2.4.1 従来手法
Ogitaらは,丸めモードの変更なしで連立一次方程式 Ax=bの数値解の精度保証を
する手法を提案している[4].この手法は浮動小数点演算の事前誤差評価を用いた手法