ひとりでのアプリ開発 - fineの備忘録 -

ひとりでアプリ開発をするなかで起こったことや学んだことを書き溜めていきます

Python - 数値演算

初めに

 Python の数値演算について、基本的な内容をまとめています。** や // 、浮動小数点数、計算の準備、math ライブラリなど数値演算で使われる要素がまとめられています。

四則演算と累乗

# 加法
print(5 + 3)  # 5と3を足して結果を出力

# 減法
print(10 - 7)  # 10から7を引いて結果を出力

# 乗法
print(4 * 6)  # 4と6を掛けて結果を出力

# 累乗
print(2**3)  # 2の3乗を計算して結果を出力

# 除法(実数)
print(8 / 2)  # 8を2で割って実数の結果を出力

# 除法(整数)
print(9 // 2)  # 9を2で割って整数部分を出力

# 剰余
print(9 % 2)  # 9を2で割った余りを出力

実数のべき表示

 "e" という文字を用いて、10 のべき表示ができます。例えば、e4 や e+4 は 10^4 を意味します。また、e-6 は 10^{-6} を意味します。

print(2.0**1000)    #1.0715086071862673e+301

num = 1.5e6
print(num)  #1500000.0

num = 10e-3
print(num)  #0.01

整数の表示

 実数の場合は、非常に大きな数はべき表示されますが、整数はコンピュータのメモリに収まる範囲で、いくらでも大きくできます。

print(2.0**10)  #1.0715086071862673e+301
print(2**1000)  #10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376

 デフォルトでは、4300行まで表示できるようですが、それを超えると次のようなエラーが表示されます。

Exceeds the limit (4300 digits) for integer string conversion; use sys.set_int_max_str_digits() to increase the limit

 例えば、次のようなべき乗のべき乗の計算をすると、4300 桁を超えてこのエラーが表示されます。

print(2**2**2**2**2)   #2^(2^16)=2^65536, これは19729桁

整数と実数の変換

 実数を整数に変換するには int 関数を、整数を実数にするには float 関数を用います。また、整数と実数の演算をしても実数として、結果が算出されます。

# 実数から整数への変換
int(5.8)  #5
int(-3.2)  #-3

# 整数から実数への変換
float(4) #4.0
4+0.0 #4.0

 注意点は、負の数を整数に変換する場合、ガウス記号のように整数部分を返すのではなく、0 の方向に切り下げてた結果を返すということです。

数値誤差

 整数を実数に変換したときには、浮動小数点数の影響で誤差が生じます。例えば、次のような場合があります。

# 0.1 と 0.2 を足して 0.3 と比較する例
x = 0.1
y = 0.2
print(x)
print(y)
result = x + y  #0.30000000000000004

print(result)
print(result == 0.3)  # False が出力される

 0.1 + 0.2 がなぜ、0.30000000000000004 になるのかという話ですが、実数の数値は内部では 2 進数で処理されています。0.1, 0.2 はどちらも有限の 2 進数では表すことができません。そのため、近似値で扱っています。そのため、0.1 と 0.2 は実際は正確には、0.1、0.2 ではなく足し算をしたときにその誤差が生じてしまったということです。

 浮動小数点数についての詳細は Python のドキュメントにも説明があります。詳細はそちらをご覧ください。

docs.python.org

計算の順序

 python では、通常の計算と同じく、括弧、積商、和差の順で計算が優先されます。

result = (3 + 2) * 4 / 2 - 1
print(result)  #9.0

 上の例の場合、3 + 2 = 5 → 5 * 4 = 20 → 20 / 2 = 10.0 → 10.0 - 1 = 9.0 の順で処理されます。なお、除算の段階で、整数から実数に変換されます。

print(5 * 2 / 3 * 4)  #13.333333333333334

 括弧がない場合は、積商、和差の順で処理されます。優先順位が同じものは左から順に処理されます。上の例の場合 5 * 2 = 10 → 10 / 3 = 3.33... → 3.33... * 4 = 13.33... となります。

数学関数

 基本的な実数に関する数学の関数がまとめられたライブラリとして、math ライブラリがあります。

docs.python.org

 ルートや初等関数、\pi \inf などの特殊な値、天井関数や順列、組み合わせを求める関数などが含まれます。

 math ライブラリは次のようにインポートして使用します。

import math

(使用例)

import math

# math.sqrt(x) の例
result_sqrt = math.sqrt(25)
print(result_sqrt)  # 出力: 5.0

# math.sin(x) の例
angle_rad = math.radians(30)  # 30度をラジアンに変換
result_sin = math.sin(angle_rad)
print(result_sin)  # 出力: 0.49999999999999994 (約0.5)

# math.log(x, [base]) の例
result_log = math.log(10)
print(result_log)  # 出力: 2.302585092994046

result_log_base_2 = math.log(8, 2)  # 底が2の対数を計算
print(result_log_base_2)  # 出力: 3.0

 なお、実数ではなく複素数に関する関数がまとめられたライブラリとして cmath ライブラリがあります。