計算誤差について

547 Views

April 05, 24

スライド概要

[第4回大阪sas勉強会]平井 健太

profile-image

SAS言語を中心として,解析業務担当者・プログラマなのコミュニティを活性化したいです

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

計算誤差について 平井 健太

2.

もくじ  自己紹介  計算誤差って?  よくやる解決方法  各社対応は?

3.

自己紹介  SAS歴 15年くらい  中小IT企業勤務  製薬関連のSAS使いで、それ以外の業界には疎い  野菜作りと料理が趣味  息子と遊ぶことも趣味 兼 修行

4.

計算誤差って?  コンピュータは、0と1の世界でできている(2進数の世界)  例えば 0.1を10回足し算する 0.1 + 0.1 + … 0.1 = 1  人間が計算すると1, コンピュータが計算しても1  でも1の中身が違うんです!  A > Bが正しく判定されなくて困った経験はないですか?  Proc compareで、見た目は同じなのに不一致が出たことないですか?

5.

コンピュータは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

6.

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にはならない

7.

解決方法は?  round関数を使う 精度を気にしない場合や、計算前の値の有効桁が明確に決められているような場 合は、気にならない程度のところで丸めてしまう。  例えば小数点以下1桁の場合なら、×10して、int関数かけて、10で割る 0.1を1にして10で割る→浮動小数点ありの値の計算で積み重なった誤差を消す。 ×10したままでは誤差が残っていることに注意。  大小比較であれば、不等号を使わない。 fuzz関数、compfuzz関数などを使う。  気にしない。

8.

みなさんの会社では、 どう対応されていますか?