teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

有効数字的に考えてみた

2018/04/20 16:09

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -5,4 +5,19 @@
5
5
  - 正の数なので符号部は0
6
6
  - 指数部は1+1023=1024で、2進法で10000000000
7
7
  - 仮数部は10の循環で52ビットまで取ると、末尾は10で終わる。(1010...10)
8
- そのあとにまだ1010...と続き、これは10進法で例えるなら丸める桁が51...のように続いていることになり、切り上げが発生する。結果、1010...1011になる
8
+ そのあとにまだ1010...と続き、これは10進法で例えるなら丸める桁が51...のように続いていることになり、切り上げが発生する。結果、1010...1011になる
9
+
10
+ ここからは私の推測だが、
11
+ 最下位ビットの1には誤差を含むことになる。この1は2進法の小数第51位なので、2^(-51)を表す。
12
+ 2^(-51) = 0.000000000000000444089209850062616169452667236328125(小数首位が第16位)
13
+ であるが、これには最大でこれの半分、
14
+ 2^(-52) = 0.0000000000000002220446049250313080847263336181640625
15
+ のプラスマイナスの誤差を含んでいる。
16
+ つまりこの部分だけで考えると、小数首位が2~6の幅を持ち、その下の桁の数字はもはや信頼できる意味を持たない数字ということになる。
17
+
18
+ そこで、これの小数首位までを有効数字とし(実際この位も振れ幅が大きいが、これを含めないと最下位ビットが0の場合と差がなくなる)、その下の桁で四捨五入して10進数の表記にしていると考えられる。
19
+ maisumakunさんのコメントから、完全な数値が
20
+ 3.333333333333333481363069950020872056484222412109375
21
+ ということなので、これの小数17位を四捨五入して
22
+ 3.3333333333333335
23
+ となったのではなかろうか。