Python 的標準函式「math」提供了許多常用的數學函式,例如三角函數、四捨五入、指數、對數、平方根、總和...等,都能夠透過 math 標準函式來進行運算。
原文參考:數學 math
本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )
下方列出幾種 math 模組常用的方法 ( 參考 Python 官方文件:math ):
方法 | 參數 | 說明 |
---|---|---|
pi、math.e | 圓周率與指數 ( 數學常數 ) | |
ceil() | x | 無條件進位到整數 |
floor() | x | 無條件捨去到整數 |
copysign() | x, y | 根據 y 的正負符號,改變 x 絕對值後的正負值 |
fabs() | x | 回傳 x 的絕對值 ( 浮點數 ) |
fmod() | x, y | 回傳 x 除以 y 的餘數 ( 浮點數 ) |
fsum() | iter | 回傳可迭代數值的加總 ( 浮點數 ) |
gcd() | x, y | 回傳 x 和 y 的最大公約數 |
pow() | x, y | 回傳 x 的 y 次方 |
sqrt() | x | 回傳 x 的平方根 |
factorial() | x | 回傳 x 的階乘 ( x!,僅限正整數 ) |
degrees()、math.radians() | x | 將角度轉為弧度,或將弧度轉為角度 |
sin()、math.cos()、math.tan() | x | 回傳 x 弧度的正弦值、餘弦值、正切值 |
asin()、math.acos()、math.atan() | x | 回傳 x 弧度的反正弦值、反餘弦值、反正切值 |
exp() | x | 回傳 e 常數的 x 次方 |
log()、math.log1p()、math.log2()、math.log10() | x | 回傳自然對數 |
isclose()) | x, y, *, rel_tol, abs_tol | 判斷 x 和 y 是否夠接近,回傳 True 或 False |
isfinite()、math.isinf() | x | 判斷 x 是否為無限大的數字,回傳 True 或 False |
isnan() | x | 判斷 x 是否為 NaN,回傳 True 或 False |
要使用 math 必須先 import math 模組,或使用 from 的方式,單獨 import 特定的類型。
import math
from math import sin
math.pi 使用後會回傳圓周率的數學常數,math.e 使用後會回傳指數的數學常數 ( 常數表示固定不變的數字 )。
import math
print(math.pi) # 3.141592653589793
print(math.e) # 2.718281828459045
math.ceil(x) 使用後會將小數點後方的數字,無條件進位到整數,以下方的程式為例,圓周率 3.14159 無條件進位後就等於 4 ( 單純四捨五入可使用內建函式 round,參考:round(x, y) )。
import math
pi = math.pi
print(math.ceil(pi)) # 4
math.floor(x) 使用後會將小數點後方的數字,無條件捨去到整數,以下方的程式為例,圓周率 3.14159 無條件捨去後就等於 3 ( 單純四捨五入可使用內建函式 round,參考:round(x, y) )。
import math
pi = math.pi
print(math.floor(pi)) # 3
math.copysign(x, y) 使用後,會根據 y 的正負符號,改變「x 絕對值」之後的正負值。
import math
print(math.copysign(10, -5)) # -10
print(math.copysign(-10, 9)) # 10
print(math.copysign(-10, -3)) # -10
math.fabs(x) 使用後會回傳* x 的絕對值*,計算結果以浮點數 float 格式呈現。
import math
print(math.fabs(-10)) # 10.0
math.fabs(x) 使用後會回傳* x 除以 y 的餘數*,計算結果以浮點數 float 格式呈現,如果要回傳整數,可使用 Python 數學計算 x % y 的語法。
import math
print(math.fmod(7,3)) # 1.0
math.fsum(iter) 使用後會回傳串列或 tuple 裡的數值加總,計算結果以浮點數 float 格式呈現。
import math
print(math.fsum([1,2,3,4,5])) # 15.0
print(math.fsum((1,2,3,4,5))) # 15.0
math.gcd(x, y) 使用後會回傳* x 和 y 的最大公約數* ( 同時可以整除 x 和 y 的最大整數 )。
import math
print(math.gcd(18,12)) # 6
math.pow(x, y) 會回傳* x 的 y 次方*,計算結果以浮點數 float 格式呈現 ( 如果需要整數,可參考內建函式 pow(x, y, z) )。
import math
print(math.pow(2, 5)) # 32.0
math.sqrt(x) 會回傳* x 的平方根*,計算結果以浮點數 float 格式呈現。
import math
print(math.sqrt(16)) # 4.0
math.factorial(x) 會回傳 x 的階乘 ( x! ),x 只能使用正整數。
import math
print(math.factorial(5)) # 120 ( 5x4x3x2x1=120 )
math.degrees(x) 將 x 弧度轉換為角度,math.radians(x) 將 x 角度轉換為弧度。
import math
print(math.radians(30)) # 0.5235987755982988
print(math.degrees(0.5236)) # 30.0000701530499
math.sin(x) 回傳 x 弧度的正弦值,math.cos(x) 回傳 x 弧度的餘弦值,math.tan(x) 回傳 x 弧度的正切值 ( 1 弧度等於 180 度/π )。
import math
r = math.radians(30) # 將 30 度轉換為弧度
print(math.sin(r)) # 0.49999999999999994
print(math.cos(r)) # 0.8660254037844387
print(math.tan(r)) # 0.5773502691896257
math.asin(x) 回傳 x 弧度的反正弦值,math.acos(x) 回傳 x 弧度的餘弦值,math.atan(x) 回傳 x 弧度的正切值 ( 1 弧度等於 180 度/π )。
import math
r = math.radians(30) # 將 30 度轉換為弧度
print(math.asin(r)) # 0.5510695830994463
print(math.acos(r)) # 1.0197267436954502
print(math.atan(r)) # 0.48234790710102493
math.exp(x) 會回傳 e 常數的 x 次方。
import math
print(math.exp(2)) # 7.38905609893065
math.log 相關的模組,可以回傳對應的自然對數。
自然對數模組 | 說明 |
---|---|
math.log(x) | 回傳 x 的自然對數 ( 底為 e ) |
math.log(x, base) | 回傳 log(x)/log(base) |
math.log1p(x) | 回傳 1+x 的自然對數 ( 底為 e ) |
math.log2(x) | 回傳 x 以 2 為底的自然對數 |
math.log10(x) | 回傳 x 以 10 為底的自然對數 |
import math
print(math.log(10)) # 2.302585092994046
print(math.log(10,3)) # 2.095903274289385
print(math.log1p(10)) # 2.3978952727983707
print(math.log2(10)) # 3.321928094887362
print(math.log10(10)) # 1.0
math.isclose 可以根據判斷 x 和 y 是否夠接近,「夠接近」的定義在於 x 和 y 的差異是否大於某個數值,如果夠接近就回傳 True,否則回傳 False。
下面的例子,在沒有設定 rel_tol 和 abs_tol 參數的狀況下,除非 x 和 y 相等,否則都是「不夠接近」。
import math
print(math.isclose(3.14, 3.14)) # True
print(math.isclose(3.14000, 3.14001)) # True
rel_tol 參數定義「相對的接近範圍」,公式為「x 和 y 的最大值乘以 rel_tol
」,下方的例子,10 和 5 的接近範圍最大是 10x0.5=5,因此如果 10-4 比 5 大,就會回傳 False ( 不接近 ),同理,10 和 20 的接近範圍最大會是 20x0.5=10,如果 20-9 比 10 大,就會回傳 False。
import math
print(math.isclose(10, 5, rel_tol=0.5)) # True
print(math.isclose(10, 4, rel_tol=0.5)) # False
print(math.isclose(20, 10, rel_tol=0.5)) # True
print(math.isclose(20, 9, rel_tol=0.5)) # False
abs_tol 參數定義「絕對的接近範圍」,公式為「x-y 的絕對值
」,下方的例子,10.4-10=0.4,0.4 小於 abs_tol 定義的 0.5,表示接近,回傳 True。
import math
print(math.isclose(10, 10.4, abs_tol=0.5)) # True 0.4<0.5
print(math.isclose(10, 10.6, abs_tol=0.5)) # False 0.6>0.5
math.isfinite(x) 和 math.isinf(x) 能判斷 x 是否為無限大的數字,回傳 True 或 False。
import math
a = float('inf')
print(math.isfinite(a)) # False a 是無限大,回傳 False
print(math.isinf(a)) # True a 是無限大,回傳 true
math.isnan(x) 能判斷 x 是否為 NaN ( 非數字 ),回傳 True 或 False。
import math
a = float('nan')
print(math.isnan(a)) # True
print(math.isnan(123)) # False
大家好,我是 OXXO,是個即將邁入中年的斜槓青年,我有個超過一千篇教學的 STEAM 教育學習網,有興趣可以參考下方連結呦~ ^_^
對於 math.isclose()
函數,當不提供 rel_tol
或 abs_tol
參數時,其預設值為 rel_tol=1e-09
和 abs_tol=0.0
。
你的範例 print(math.isclose(3.14000, 3.14001)) # True
應該返回 False 而不是 True。