これから始めるPythonプログラミング⑥

スキルアップ

前回はデータ型と宣言について学びました。

今回は数値に関するデータ型をもう少し詳しく見ていきます。

数値型の使い方

まずは各データ型の使い方を学びます。
値は適当に入れてみてください。
①整数型

a: int=2
b: int=5
print(a*b)

c: int=2.0
d: int=3.0
print(c*d)

a*bは10と表示されますが、c*dは6.0と表示されました。

②浮動小数点型

a: float=2.1
b: float=3.5
print(a, b, a+b)

小数の計算ができていますね。
浮動小数点型では次のような指数表現も可能です。

a: float=1e3
b: float=1e-2
print(a)
print(b)

eは大文字のEでも構いません。どちらにしても、次のように表示されるはずです。


③複素数型

a: complex=1+2j
b: complex=5+6j
print(a+b)
print(a*b)

複素数の計算もできています。カッコでくくられていますね。

複素数は次のように生成・表示することもできます。

c=complex(1,2)
print(c)
print(c.real)
print(c.imag)

実部・虚部が認識されています。

浮動小数点と精度

先ほどの浮動小数点型の例では小数の足し算を行いましたが、試しに掛け算をするとどうなるでしょうか。

a: float=2.1
b: float=3.5
print(a, b, a*b)

答えは7.35のはずですが、なぜか末尾に5がついてしまいました。
どうしてこのようなことが起きるのでしょうか。

Pythonの浮動小数点は固定精度しか持っておらず、小数点以下の計算に誤差が生じることがあります。コンピュータは浮動小数点を二進数で表現しているため、一部の十進数は二進数で精確に表すことができません。どこかで小数点を丸め込まなければならないのです。

どうすれば7.35と表示させられるでしょうか。
ここでは2つの方法を紹介します。

表示桁数を調整する方法

単に見栄えだけの問題であれば、表示する桁数を調整する方法が簡単です。

a: float=2.1
b: float=3.5
c=a*b
print(f"{c:.2f}")

7.35と表示されましたね。
上のコードでは、.2fの部分で小数第2位まで表示するよう指定しています。この部分を変えれば表示桁数を調整することができます。

この方法では、計算結果が分かっていて表示・出力だけ整えたい場合には有効です。
しかし、この後でこの計算結果を再度使って計算するような場合はどうでしょうか。

a: float=2.1
b: float=3.5
c=a*b
print(f"{c:.2f}")
d=c*1000000000000000
print(d)

なぜか1の位に1が出現しましたね。
この方法はあくまで表示桁数を調整しているだけで、cに格納された値は保持されたままなのです。したがってdの計算結果では誤差が生じてしまうのです。

decimalモジュールを使う方法

計算精度という点では、decimalモジュールを使う方法が有効です。
decimalモジュールとはPython標準ライブラリに含まれているモジュールで、高精度の十進数計算を行うために使用されます。このモジュールにより、浮動小数点の丸め誤差を避け、十進数で高精度の計算を行うことができます。

from decimal import Decimal, getcontext

#set precision(e.g. 6 decimal places)
getcontext().prec=6

a=Decimal('2.1')
b=Decimal('3.5')
c=a*b
print(c)

1行目でdecimalモジュールからDecimalクラスとgetcontext関数をインポートしています。decimalモジュールとDecimalクラスは別物なので、大文字・小文字をしっかり区別しましょう。getcontext関数は、現在のコンテキスト(設定)を取得するための関数です。
実行すると、次のように7.35という結果を得ます。

decimalモジュールは次のような計算に用いられます。

  • 金融計算: 利息や税金の計算
  • 科学計算: 非常に小さい数や大きい数の計算、精度が求められる計算
  • 正確な制御が必要なアルゴリズム: バランスの取れたデータ処理や、誤差が積み重なると問題が大きくなるアルゴリズムなど

ちなみにFortranであれば浮動小数点の精度を指定できます。科学計算は精度も計算速度も重要ですが、古くからFortranが好まれるのはこういった理由もあるからなのですね。

今回は数値型と精度について学びました。次は文字列の型を詳しく見てみます。続く!

タイトルとURLをコピーしました