そもそもFloatとは

14
そもそもFloatとは @akuraru 13925日水曜日

Transcript of そもそもFloatとは

Page 1: そもそもFloatとは

そもそもFloatとは@akuraru

13年9月25日水曜日

Page 2: そもそもFloatとは

自己紹介

• akuraru

• プログラマ

• SQLAPですがDBの話はしない

13年9月25日水曜日

Page 3: そもそもFloatとは

数値• 機械は2進数しか理解できない。

• すべて0又は1で表現されている

• 4 = 100

• 10 = 1010

13年9月25日水曜日

Page 4: そもそもFloatとは

小数点• 小数点以下も0又は1で表す

• 2進数なので(1/2)**nで表す

• 0.5 = 0.1

• 0.125 = 0.001

13年9月25日水曜日

Page 5: そもそもFloatとは

小数点• 0.1 とかはどうなるの?

• 循環小数で表す

• 0.1 = 0.00011

• 0011が無限に続ければ0.1を表せる

13年9月25日水曜日

Page 6: そもそもFloatとは

Float

• 実際のメモリ領域は有限

• ある程度のところで切り上げている

• 0.1 = 0.00011001100110011001100110011

13年9月25日水曜日

Page 7: そもそもFloatとは

Float• ある程度とはどのくらい?

• その前に仮数と、指数というのがある

• 1001100110011001100110011が仮数

• -4が指数

• 0.1 = 1.1001100110011001100110011 * 10^-4

13年9月25日水曜日

Page 8: そもそもFloatとは

Float

• C言語の場合

• Floatの指数8ビット、仮数23ビット

• double の指数11ビット、仮数52ビット

13年9月25日水曜日

Page 9: そもそもFloatとは

Floatの問題• いろいろな誤差がある。

• オーバーフロー

• 桁落ち

• 情報落ち

• 積み残し

• 丸め誤差

• ってWikipediaに書いてあった。13年9月25日水曜日

Page 10: そもそもFloatとは

• SQLAPということで丸め誤差だけ説明します

• 他はググってください

13年9月25日水曜日

Page 11: そもそもFloatとは

丸め誤差• 0.1 を100倍して 10 になると思うな!

• 10 = 1010

• 0.1 = 0.00011001100110011001100110011

• 100 = 1100100

• 0.1 * 100 = 1001.11111111111...13年9月25日水曜日

Page 12: そもそもFloatとは

DECIMAL

• ちゃんと調べてない。

• 2進数で0.1をそのまま表すからよくない

• 1 * 10 ^ -1 と表せば解決

• DBには1を保存して取り出すときに10で割ればいい。

13年9月25日水曜日

Page 13: そもそもFloatとは

計算式を保存する• 0.1なんていう結果を保存するから良くない

• 計算過程を保存しておけば安全

• div(1, 10)とか保存しておくばいい

13年9月25日水曜日

Page 14: そもそもFloatとは

まとめ

• プログラミング言語でもFloatをforで足していくのも誤差が出ます

• 整数で計算して、必要なときに割る

13年9月25日水曜日