読者です 読者をやめる 読者になる 読者になる

Coding Memos

try {coding} catch {questions}

【疑問】Python3の算術処理計算【ゼロ作DL_2】

「ゼロから作るDeep Learning」疑問

というか、Python3の疑問?むしろコンピュータ全体としての疑問になるのかな?

小数の桁数

Python3インタプリタの対話モードで算術を試していました。

>>> 3 / 2
1.5
>>> 3 + 5
8
>>> 1 / 3
0.3333333333333333

さて、上二つは納得です。数学的にも。 一番下は、数学的には、無限に3が続くわけですが、小数点以下が16桁で止まっているのはなぜだろうと 疑問が湧きました。

9.4. decimal — 十進固定及び浮動小数点数の算術演算 — Python 3.6.0 ドキュメント

1.1 や 2.2 のような数は、二進数の浮動小数点型では正しく表現できません。エンドユーザは普通、 二進数における 1.1 + 2.2 の近似値が 3.3000000000000003 だからといって、そのように表示してほしいとは考えないものです。

とあります。もちろんそうですし、利用上の問題はおそらくなんの問題もないのです。

ついでに

>>> from decimal import *
>>> Decimal(1/3)
Decimal('0.333333333333333314829616256247390992939472198486328125')

と出してくれます。まぁ二進数的な計算では小数桁が進むほど、誤差が出るというのはなんとなく知っていますが。1482…となっているところで、ばっさりpython的に切ってくれているのか、33333がまだ続くなら、はじめて3以外の数字が出てくるところで切ってくれるのか、デフォルト的に小数以下は16桁まだしかfloatの場合は表示しないのか。

>>> import math
>>> math.pi
3.141592653589793
>>> Decimal(math.pi)
Decimal('3.141592653589793_115997963468544185161590576171875') // アンスコ入れてます
// 数学的なπ 3.141592653589793_23846 2643383279 // アンスコ入れてます

piにて比較すると、アンスコのところで、コンピュータが出す値と、数学として正しい値のπの結果が変わります。 そして、math.piも正しいところまでが表示されるようです。

9.2. math — 数学関数 — Python 3.6.0 ドキュメント

には、利用可能な精度の、数学定数π

とあります。利用可能な精度をうまく処理しているのかな?

お詳しい方いらっしゃったらおしえてください〜。

追記

と、ツイートをいただいたので、 Wikipediaを見てみる。

倍精度浮動小数点数 - Wikipedia

指数部が全て 0(ゼロ、および非正規化数)の場合を除き、仮数部で表現されるビットパターンのさらにひとつ上のケタに暗黙の 1 のビットがあるとみなす表現法(いわゆる「ケチ表現」)により、通常の数(正規化された数)の精度は、53ビット相当[1](十進に直すと約16桁、 {\displaystyle 53\log {10}(2)\approx 15.955} 53\log {{10}}(2)\approx 15.955)である。

で、約16桁ってのは確かに納得のいく説明っぽいですね。

なるほど。

もし正しくなさそうなら、正しい情報を得た時にアップデートすればいいので、今はこの説明で納得しておく、というのが私の学習スタイルです。

ぜるめふさんどうもありがとうっ!