そもそもFloatとは
Transcript of そもそもFloatとは
そもそもFloatとは@akuraru
13年9月25日水曜日
自己紹介
• akuraru
• プログラマ
• SQLAPですがDBの話はしない
13年9月25日水曜日
数値• 機械は2進数しか理解できない。
• すべて0又は1で表現されている
• 4 = 100
• 10 = 1010
13年9月25日水曜日
小数点• 小数点以下も0又は1で表す
• 2進数なので(1/2)**nで表す
• 0.5 = 0.1
• 0.125 = 0.001
13年9月25日水曜日
小数点• 0.1 とかはどうなるの?
• 循環小数で表す
• 0.1 = 0.00011
• 0011が無限に続ければ0.1を表せる
13年9月25日水曜日
Float
• 実際のメモリ領域は有限
• ある程度のところで切り上げている
• 0.1 = 0.00011001100110011001100110011
13年9月25日水曜日
Float• ある程度とはどのくらい?
• その前に仮数と、指数というのがある
• 1001100110011001100110011が仮数
• -4が指数
• 0.1 = 1.1001100110011001100110011 * 10^-4
13年9月25日水曜日
Float
• C言語の場合
• Floatの指数8ビット、仮数23ビット
• double の指数11ビット、仮数52ビット
13年9月25日水曜日
Floatの問題• いろいろな誤差がある。
• オーバーフロー
• 桁落ち
• 情報落ち
• 積み残し
• 丸め誤差
• ってWikipediaに書いてあった。13年9月25日水曜日
• SQLAPということで丸め誤差だけ説明します
• 他はググってください
13年9月25日水曜日
丸め誤差• 0.1 を100倍して 10 になると思うな!
• 10 = 1010
• 0.1 = 0.00011001100110011001100110011
• 100 = 1100100
• 0.1 * 100 = 1001.11111111111...13年9月25日水曜日
DECIMAL
• ちゃんと調べてない。
• 2進数で0.1をそのまま表すからよくない
• 1 * 10 ^ -1 と表せば解決
• DBには1を保存して取り出すときに10で割ればいい。
13年9月25日水曜日
計算式を保存する• 0.1なんていう結果を保存するから良くない
• 計算過程を保存しておけば安全
• div(1, 10)とか保存しておくばいい
•
13年9月25日水曜日
まとめ
• プログラミング言語でもFloatをforで足していくのも誤差が出ます
• 整数で計算して、必要なときに割る
13年9月25日水曜日