Pythonによる四則演算と分数の計算

Pythonによる演算の基本

Pythonによる四則演算

pythonにより割り算を除く和、差、積、べき乗の計算をします。

  1. #1 python の四則演算
  2. x = 7
  3. y = 3
  4. print('和:', x + y)
  5. print('差:', x - y)
  6. print('積:', x * y)
  7. print('べき乗:', x**y)

和: 10
差: 4
積: 21
べき乗: 343

べき乗は”**”を使います。ExcelやLatexでは”^”を使うので、注意が必要です。

Pythonによる割り算

Pythonによる割り算をします。

割る数も割れれる数も正の場合

割られる数をdividend、割る数をdivisorとすると、割り算はdividend / divisorで計算します。

  1. #2 Pythonでの割り算の計算
  2. dividend = 17
  3. divisor = 3
  4. result = dividend / divisor
  5. print('割り算:', result)
  6. quotient = dividend // divisor
  7. print('商:',quotient )
  8. remainder = dividend % divisor
  9. print('余り:', remainder)
  10. print('検証:',dividend-quotient*divisor)

割り算: 5.666666666666667
商: 5
余り: 2
検証: 2

  1. 4行目のように、通常、割り算は”/”を使い、少数点表示となり割り切れないときは、JupyterNotebookでは有効桁数(整数部分と小数部分を合わせて)17桁程度で、最後の桁は四捨五入して表示されます。
  2. 6行目のように、商(小数点以下を切り捨て)を求めるときは、”//”を使います。
  3. 8行目のように、商を求めた際の余りは”%”を使います。余りは次の式で計算されます。
  4. 3の結果を10行目で検証しています。

$余り(remainder))=割られる数(dividend:)-商(quotient)×割る数(divisor)$

割られる数がマイナスの場合

切り捨て除算において、割られる数がマイナスの場合です。

  1. #3 Pythonでの割り算の計算
  2. dividend = -17 # 割られる数字がマイナス
  3. divisor = 3
  4. result = dividend / divisor
  5. print('割り算:', result)
  6. quotient = dividend // divisor
  7. print('商:', quotient)
  8. remainder = dividend % divisor
  9. print('余り:', remainder)
  10. print('検証:', dividend-quotient*divisor)

割り算: -5.666666666666667
商: -6
余り: 1
検証: 1

  1. 4行目のように、結果は-5.66・・・7となり、5行目で、小数点以下を切り捨てた場合はマイナス方向に切り捨てられて-6になります。
  2. 割る数が正、割られる数が負の場合も、商は負の数になったときには0の反対の方向に切り捨てます。

つまり、定規を考えるとすべての場合において左側に切り捨てられます。このため、余りは次の式で計算します。

Pythonの演算のまとめ

Pythonに関する演算をまとめると次の通りになります。

演算 記号 概 要
+ 足し算
- 引き算
* 掛け算
べき乗 ** べき乗 平方根はx**0.5で計算
割り算 / 割り算で割り切れない場合は有効桁数17桁程度まで表示
// 割り算の結果小数点以下を切り捨て
余り % 割り算で賞を求めた時の余り

分数の計算

簡単な分数の計算

Pythonでは、割り算と同じ考え方で分数の計算をすることができます。

  1. #4 分数の計算
  2. print(3 / 5)
  3. print(1 / 3)
  4. print(3 / 5 + 1 / 3)

0.6
0.3333333333333333
0.9333333333333333

通常は小数に変換して計算するので、分数同士の和の計算も少数で表示されます。

モジュールを使った分数の計算

fractionsモジュールを使った分数の計算

分数を少数に変換せず、分数のまま計算したいことがあります。このときにはfractionsモジュールのFraction関数を使います。fractionは分数を意味します。

  1. #5 fractionsモジュールによる分数の計算
  2. import fractions
  3. print(fractions.Fraction(3, 5))
  4. print(fractions.Fraction(3, 5)+fractions.Fraction(1, 3))
  5. print(fractions.Fraction(5, 24)+fractions.Fraction(2, 48))

3/5
14/15
1/4

Fraction関数を使うと分数のままで計算され、結果は通分されます。分数から分子と分母を取り出すこともできます。

  1. #6 分数の分子と分母を取り出す
  2. print(fractions.Fraction(3, 5).numerator)
  3. print(fractions.Fraction(3, 5).denominator)

分子: 3
分母: 5

numeratorは分子、denominatorは分母を意味します。

SymPyモジュールを使った分数の計算

SymPyモジュールのRational関数を使い分数の計算をすることができます。rationalは有理数を意味します。

  1. #7 SymPyのRational関数の計算
  2. import sympy
  3. display(sympy.Rational(3, 5))
  4. display(sympy.Rational(3, 5)+sympy.Rational(1, 3))
  5. display(sympy.Rational(5, 24)+sympy.Rational(2, 48))

SymPyによる分数の表示
SymPyによる分数の表示

SymPyモジュールでは、Ipythonモジュールのdisplay関数を使うと分数を読みやすく表示することができます。

Pythonによる無理数の計算

平方根、円周率、自然対数の計算

平方根、円周率、自然対数のような特殊な数はmathモジュールで計算することができます。

  1. #8 mathモジュールによる無理数の計算
  2. import math
  3. print('2の平方根1;', 2**0.5)
  4. print('2の平方根2;', math.sqrt(2))
  5. print('円周率;', math.pi)
  6. print('自然対数;', math.e)

2の平方根1; 1.4142135623730951
2の平方根2; 1.4142135623730951
円周率; 3.141592653589793
自然対数; 2.718281828459045

  1. 平方根のような基本的な計算もPythonの組み込み関数には用意されていません。3行目のように0.5乗により計算することもできますが、プログラムを読む人にはわかりづらいので、mathモジュールをimportしてsqrt関数を使います。
  2. mathモジュールでは、円周率は定数としてpiを使います。
  3. 同じく、自然対数は定数としてeを使います。

平方根、円周率、自然対数の計算

同様にSymPyモジュールでも平方根、円周率、自然対数を計算することができます。SymPyモジュールは代数計算のためのモジュールで数式表示ができることが特徴です。

  1. #9 SymPyによる特殊な数値の計算
  2. import sympy
  3. print('平方根を記号表示 :',sympy.sqrt(2))
  4. print('平方根を数値化  :',sympy.sqrt(2).evalf())
  5. print('円周率を記号表示 :',sympy.pi)
  6. print('円周率を数値化  :',sympy.pi.evalf())
  7. print('自然対数を記号表示:',sympy.E)
  8. print('自然対数を数値化 :',sympy.E.evalf())

平方根を記号表示 : sqrt(2)
平方根を数値化  : 1.41421356237310
円周率を記号表示 : pi
円周率を数値化  : 3.14159265358979
自然対数を記号表示: E
自然対数を数値化 : 2.71828182845905

  1. 3行目のようにsympy.sqrt(2)としただけでは、$\sqrt{2}$のように数式で表示されます。数値で表示するときは、4行目のようにevalfメソッドにより少数に変換します。
  2. 5行目のように、円周率は定数piを使います。やはり6行目のようにevalfメソッドにより少数に変換することができます。
  3. 7行目のように、自然対数はEを使います。mathモジュールは小文字、SymPyモジュールは大文字になります。

fractionsモジュールによる少数の分数近似

fractionsモジュールを使うと、少数を分数で近似させることができます。Fraction関数に少数を渡し、limit_denominator()メソッドを提供します。

  1. #10 fractionsモジュールによる少数の分数近似
  2. print('0.0526315・・・・の分数近似;',fractions.Fraction(0.05263157894736842).limit_denominator())
  3. print('円周率を3桁の分数で分数近似;',fractions.Fraction(math.pi).limit_denominator(1000))
  4. print('円周率を6桁の分数で分数近似;',fractions.Fraction(math.pi).limit_denominator(100000))

0.0526315・・・・の分数近似; 1/19
円周率を3桁の分数で分数近似; 355/113
円周率を6桁の分数で分数近似; 312689/99532

  1. 0.0526315・・・・のような小数に、Fraction関数に渡し、limit_denominator()を適用すると、1/19と、これに近似される分数を計算することができます。
  2. 円周率を与えると同じように近似した分数を計算することができます。このとき、limit_denominator(1000)のように桁数を示す数値を指定すると、近似的な分数の桁数を指定することができます。
  3. 円周率の分数近似で6桁の分数にしたいときは、limit_denominator(1000000)のようにします。

まとめ

これまで、pythonの基本的な演算を見てきました。非常に多彩な機能が備わっていることがわかりましたが、一方で少数以下の計算をすると、不思議なことが起こります。

  1. #11 pythonにおける小数点の怪
  2. print(10/3)
  3. print(0.1+0.1+0.1)

3.3333333333333335
0.30000000000000004

これは、コンピュータが計算するときに、数値を2進法に置き換えていることによるものです。この誤差については、また別にご紹介します。