math.sqrt() / math.ceil() / math.floor()
| 対応: | Python 2(2000) |
|---|
『math』モジュールが提供する平方根・切り上げ・切り捨て・特殊値判定の関数です。浮動小数点数の精密な計算に使用します。
構文
import math # 平方根を計算します math.sqrt(数値) # 切り上げ(以上の最小整数)を返します math.ceil(数値) # 切り捨て(以下の最大整数)を返します math.floor(数値) # ゼロ方向への切り捨てを返します math.trunc(数値) # 数値が NaN(非数)かどうか確認します math.isnan(数値) # 数値が無限大かどうか確認します math.isinf(数値)
関数一覧
| 関数 | 概要 |
|---|---|
| math.sqrt(x) | xの平方根(正の平方根)を浮動小数点数で返します。xが負の場合は『ValueError』が発生します。 |
| math.ceil(x) | xの切り上げ値(x以上の最小の整数)を整数で返します。 |
| math.floor(x) | xの切り捨て値(x以下の最大の整数)を整数で返します。 |
| math.trunc(x) | xの小数部分を切り捨て、整数部分を返します。正負に関わらずゼロ方向に切り捨てます。 |
| math.isnan(x) | xが『NaN』(非数、Not a Number)の場合に『True』を返します。 |
| math.isinf(x) | xが正または負の無限大(『inf』)の場合に『True』を返します。 |
サンプルコード
math_sqrt_ceil_1.py
import math
# sqrt() で平方根を計算します
print(math.sqrt(9))
print(math.sqrt(2))
print(math.sqrt(0.25))
# 負の数の平方根は虚数なのでエラーになります
try:
math.sqrt(-1)
except ValueError as e:
print(f'エラー: {e}')
実行すると次のように出力されます。
python3 math_sqrt_ceil_1.py 3.0 1.4142135623730951 0.5 エラー: math domain error
math_sqrt_ceil_2.py
import math # ceil() で切り上げます print(math.ceil(3.1)) print(math.ceil(3.9)) print(math.ceil(-3.1)) # floor() で切り捨てます print(math.floor(3.9)) print(math.floor(-3.1)) # trunc() はゼロ方向への切り捨てです print(math.trunc(3.9)) print(math.trunc(-3.9))
実行すると次のように出力されます。
python3 math_sqrt_ceil_2.py 4 4 -3 3 -4 3 -3
math_sqrt_ceil_3.py
import math
# isnan() と isinf() で特殊値を確認します
nan_val = float('nan')
inf_val = float('inf')
print(math.isnan(nan_val))
print(math.isinf(inf_val))
print(math.isinf(-inf_val))
# ページ数の計算など実用例(切り上げ)
total_items = 25
per_page = 10
pages = math.ceil(total_items / per_page)
print(f'{pages}ページ必要です。')
実行すると次のように出力されます。
python3 math_sqrt_ceil_3.py True True True 3ページ必要です。
よくあるミス
よくあるミス1: sqrt() の結果を整数として使う
『math.sqrt()』は常に浮動小数点数を返します。整数の平方根が必要な場合は『int()』で変換します。ただし、浮動小数点誤差により意図しない結果になることがあるため、Python 3.8以降では整数の平方根には『math.isqrt()』の使用も検討できます。
mistake1_ng.py
import math result = math.sqrt(9) print(result) print(type(result))
実行すると次のように出力されます。
python3 mistake1_ng.py 3.0 <class 'float'>
mistake1_ok.py
import math result = int(math.sqrt(9)) print(result) print(type(result))
実行すると次のように出力されます。
python3 mistake1_ok.py 3 <class 'int'>
よくあるミス2: ceil() と floor() の符号の挙動を間違える
負の数に対して『ceil()』と『floor()』は直感と異なる場合があります。『ceil(-3.1)』は『-3』(ゼロ方向)、『floor(-3.1)』は『-4』(負の無限大方向)になります。
mistake2_ng.py
import math print(math.floor(-3.1))
実行すると次のように出力されます。
python3 mistake2_ng.py -4
mistake2_ok.py
import math print(math.ceil(-3.1)) print(math.floor(-3.1)) print(math.trunc(-3.1))
実行すると次のように出力されます。
python3 mistake2_ok.py -3 -4 -3
概要
『math.ceil()』と『math.floor()』は数値の方向性が異なります。『ceil()』は常に大きい方向(正の無限大方向)へ切り上げ、『floor()』は常に小さい方向(負の無限大方向)へ切り捨てます。一方『math.trunc()』は正負に関わらず常にゼロ方向へ切り捨てます。正の数では『floor()』と『trunc()』は同じ結果になりますが、負の数では異なります。
『math.sqrt()』は常に浮動小数点数を返します。整数の平方根が必要な場合は『int(math.sqrt(x))』で整数に変換できます。負の数の平方根を求めるには複素数用の『cmath.sqrt()』を使う必要があります。
数学定数・対数・三角関数は『math.pi / math.e / math.log() / math.sin()』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。