Aug 27, 2016

割り算

まず、Pythonを入って、下記の内容を実行しましょう!

>>> 2/4
0
>>> 2.0/4
0.5
>>> 2/4.0
0.5
>>> 2.0/4.0
0.5

Python 2.7 の中に整数割整数の結果は整数となります。まだ、小数点を入った場合、結果は小数点を付け数値となります。

まだ、Python で、下記の内容を実行すると、下記のような変な結果を出ます。

>>> 10.0/3
3.3333333333333335

普通の数学の理論を使えば、正しい結果は 3.3333333333... べきです。なぜ Python で上記のような変な結果を出ます。もしかしてこれは Python の bug でしょうか? 実は、これは Python の問題ではんなく、他のプログラム言語にも同じ問題があります。問題の原因は 10進数と 2進数の変換となります。Computer が計算を実施している際、2進数で利用しております。10進数から 2進数に変換した時、小数点の問題を出ました。
例えば、10進数の 0.1 は、2進数で変換した場合、下記のような結果となります。
0.0001100110011001100110011001100110011001100110011...
つまり, 2進数で変換した結果は 10進数の 0.1 にイコールではないです。従いましてPython で上記のような結果となります。

Pythonで整数割整数の正しい結果を表示したい場合は、module を引用する方法があります。さて、Python で下記の内容を実行しましょう

>>> from __future__ import division
>>> 5 / 2
2.5

まだ、情報工学の分野の中に modulo の演算があります。Python で下記のように実行することができます

>>> 5 % 2
1
>>> 7 % 4
3
>>> divmod(5,2)
(2, 1)
>>> divmod(7,4)
(1, 3)
>>> 

divmod() は built-in function と言います。divmod の詳細の定義を確認したい場合、Python のhelp をご利用いただけますと思います。

>>> help(divmod)

Help on built-in function divmod in module __builtin__:

divmod(...)
    divmod(x, y) -> (quotient, remainder)
    
    Return the tuple ((x-x%y)/y, x%y).  Invariant: div*y + mod == x.

最後にもう一つの関数 - round()を紹介したいと思います。早速にこの関数を試します

>>> round(2.675,2)
2.67

へい〜〜、この結果は bug ではないですか?Python のDocumentの中に下記の説明があります。

Note: The behavior of round() for floats can be surprising: for example, round(2.675, 2) gives 2.67 instead of the expected 2.68. This is not a bug: it’s a result of the fact that most decimal fractions can’t be represented exactly as a float. See Floating Point Arithmetic: Issues and Limitations for more information.

やっぱり、根本原因は 10進数から 2進数へ変更した際問題がありますね。