Qsの日記: 四捨五入の誤差
日記 by
Qs
受託である演算ブロックを作っている。演算誤差をなるべく減らすために四捨五入をしなければいけない。
四捨五入、Cだったらround()という関数がある。RTLだったらどう作るか。切り捨てたいビット位置の1bit LSB側に1を加えて切り捨てればいいんだろう。でもそれでは中途半端な知識であることに気がつく。
演算ブロックがほぼ完成し、演算誤差が±LSBに収まった。でも誤差が負になっているものが多い。なぜだ。
そーゆーわけで、大学時代に使用したIsrael KorenのComputer Arithmetic Algorithmsをとても久しぶりに開いてみる。roundの部分を見ると、四捨五入は長期的に正のバイアスがかかる、と解説付きで書かれている。すばらしい。
演算ブロックの処理は複雑なので、このバイアスがあのような誤差になっているという直接的な原因かどうかはわからないけど、四捨五入したからって誤差が0中心にきれいに分布するわけではないことは言えるかもしれない。
ちなみにこの本、数表現や演算に関して目から鱗的な解説がなされており、うまく説明できないけど新たな境地へ連れて行かれた感があったのを今でも覚えている。
四捨五入の誤差 More ログイン