---
title: 計算誤差について
tags:  #[第4回大阪sas勉強会]  
author: [森岡裕[SASユーザー総会世話人]](https://convert.docswell.com/user/6484025)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/V7NGWW44E8.jpg?width=480
description: [第4回大阪sas勉強会]平井　健太
published: April 05, 24
canonical: https://convert.docswell.com/s/6484025/5YW383-2024-04-05-175456
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/V7NGWW44E8.jpg)

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


# Page. 2

![Page Image](https://bcdn.docswell.com/page/YJ9WXXQ4J3.jpg)

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


# Page. 3

![Page Image](https://bcdn.docswell.com/page/GJ8N22GVED.jpg)

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


# Page. 4

![Page Image](https://bcdn.docswell.com/page/LJLP22GRER.jpg)

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


# Page. 5

![Page Image](https://bcdn.docswell.com/page/47M488QPEW.jpg)

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


# Page. 6

![Page Image](https://bcdn.docswell.com/page/P7RW558YE9.jpg)

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


# Page. 7

![Page Image](https://bcdn.docswell.com/page/PJXPKK84EX.jpg)

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


# Page. 8

![Page Image](https://bcdn.docswell.com/page/3JKD55KP7D.jpg)

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


