670 Views
April 05, 24
スライド概要
[第4回大阪sas勉強会]平井 健太
SAS言語を中心として,解析業務担当者・プログラマなのコミュニティを活性化したいです
計算誤差について 平井 健太
もくじ 自己紹介 計算誤差って? よくやる解決方法 各社対応は?
自己紹介 SAS歴 15年くらい 中小IT企業勤務 製薬関連のSAS使いで、それ以外の業界には疎い 野菜作りと料理が趣味 息子と遊ぶことも趣味 兼 修行
計算誤差って? コンピュータは、0と1の世界でできている(2進数の世界) 例えば 0.1を10回足し算する 0.1 + 0.1 + … 0.1 = 1 人間が計算すると1, コンピュータが計算しても1 でも1の中身が違うんです! A > Bが正しく判定されなくて困った経験はないですか? Proc compareで、見た目は同じなのに不一致が出たことないですか?
コンピュータは0.1をどう表現している のか 10であれば 4 3 2 1 0 -1 -2 -3 24 23 22 21 20 2-1 2-2 2-3 16 8 4 2 1 0.5 0.25 0.125 23 + 21 = 8 + 2 = 10 コンピュータ内部では 4 3 2 1 0 -1 -2 -3 24 23 22 21 20 2-1 2-2 2-3 16 8 4 2 1 0.5 0.25 0.125 1 0 1 0
0.1をどう表現しているのか 0.1であれば 0 -1 -2 -3 -4 -5 -6 -7 -8 20 2-1 2-2 2-3 2-4 2-5 2-6 2-7 2-8 1 0.5 0.25 0.125 0.0625 0.03125 0.015625 0.0078125 0.00390625 0 0 0 0 1 1 1 0 0 0.0625 + 0.03125 + 0.00390625 + … ≒ 0.1 2進数で表現すると0.0001100110011…となり、0011の循環小数になる 10進数の0.1にはならない
解決方法は? round関数を使う 精度を気にしない場合や、計算前の値の有効桁が明確に決められているような場 合は、気にならない程度のところで丸めてしまう。 例えば小数点以下1桁の場合なら、×10して、int関数かけて、10で割る 0.1を1にして10で割る→浮動小数点ありの値の計算で積み重なった誤差を消す。 ×10したままでは誤差が残っていることに注意。 大小比較であれば、不等号を使わない。 fuzz関数、compfuzz関数などを使う。 気にしない。
みなさんの会社では、 どう対応されていますか?