2013/11/04(月)丸めモードの変更

精度保証付き数値計算の基本は区間演算であり、区間演算は丸め誤差の影響を区間内に含むように、下限は下向き丸めで、上限は上向き丸めで計算する。これを行う最も基本的な方法はIEEE 754 Std.で規定された丸めモードの変更を用いる方法である。

丸めモードの変更に関しては気を付けなければいけないポイントが大変多く、講義なんかするときにもすぐに忘れそうになるので、IntelのCPUに関してまとめた資料を作ったので、ここにアップしておく。

roundingmode.pdf

なお、kvライブラリにおいては、この資料の7章にあるようにコンパイラに備わっているfesetroundまたは_controlfpを用いており、最速というわけではない。が、Intel以外のCPUを含む割と多くの環境で安定して動くというメリットもある。

IntelのCPUで64bitモードの場合に限って、KV_FASTROUNDというマクロを定義すると、Intrinsicを用い、プログラム起動時に予めレジスタ値を計算し丸め変更時には書き込むだけという速くなりそうな方法を使うようになる。FPUは使わないと仮定してSSE2の丸めモードしか変更しないし、MXCSRレジスタの丸めモード以外の部分の値を全くケアしないので、そのことによる副作用をよく理解した上で使う必要がある。

なお、プログラミング言語や環境によっては丸めモードの変更をしづらいこともあり、丸めモードの変更を行わずに精度保証する方法の研究も進んでいることを付記しておく。
OK キャンセル 確認 その他