pythonで小数点の計算をしていると・・・
Pythonで小数点の計算をするとおかしなことが起こります。
print(0.1)
print(0.1+0.1)
print(0.1+0.1+0.1)
0.1
0.2
0.30000000000000004
0.1を2回までは良いですが、3回足し合わせると妙なことが起こります。
print(0.1*3)
print(0.1+0.1+0.1 == 0.3)
3倍しても結果は同じ、0.1を3つ足し合わせると0.3とは違うといわれてしまいます。
print(format(0.1, '.100f'))
format関数を使って100桁まで表示すると次のようになります。
0.1000000000000000055511151231257827021181583404541015625000000000000000000000000000000000000000000000
ある桁数まで表示して、それ以降は0が並びます。
len('1000000000000000055511151231257827021181583404541015625')
55
55桁まで計算されています。このように実際に計算に使われる桁数を有効桁数といいます。つまり有効桁数が55桁程度と考えられます。
理由は2進数だから・・・
0.1の計算がおかしいと思うのは、もともとコンピュータでは数字を2進数で扱っているからです。0.1を小数点であれわすとぴったりと割り切れません。人間にとっては0.1というのは切りの良い数字なのですが、2進数によるコンピュータにとっては中途半端な数字になるわけです。つたないプログラムですが0.1を2進数にすると次にようになります。ここでは100桁まで計算しています。
x = 0.1
for i in range(100):
y = x//2
if i == 1:
print('0.', end='')
if i > 1:
print(int(y), end='')
x = (x-y*2)*2
0.00011001100110011001100110011001100110011001100110011010000000000000000000000000000000000000000000
len('1100110011001100110011001100110011001100110011001101')
52
最初の1から最後の1までの桁数が52桁程度になります。このあたりわからないことがたくさん出てきます。また調べてみます。