iT邦幫忙

2023 iThome 鐵人賽

DAY 18
0
Software Development

跟著 OXXO 一起學 Python系列 第 36

( Day 18.1 ) Python 數學 math

  • 分享至 

  • xImage
  •  

Python 的標準函式「math」提供了許多常用的數學函式,例如三角函數、四捨五入、指數、對數、平方根、總和...等,都能夠透過 math 標準函式來進行運算。

原文參考:數學 math

本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )

math 常用方法

下方列出幾種 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

import math

要使用 math 必須先 import math 模組,或使用 from 的方式,單獨 import 特定的類型。

import math
from math import sin

pi、math.e

math.pi 使用後會回傳圓周率的數學常數,math.e 使用後會回傳指數的數學常數 ( 常數表示固定不變的數字 )。

import math
print(math.pi)    # 3.141592653589793
print(math.e)     # 2.718281828459045

ceil(x)

math.ceil(x) 使用後會將小數點後方的數字,無條件進位到整數,以下方的程式為例,圓周率 3.14159 無條件進位後就等於 4 ( 單純四捨五入可使用內建函式 round,參考:round(x, y) )。

import math
pi = math.pi
print(math.ceil(pi))   # 4

floor(x)

math.floor(x) 使用後會將小數點後方的數字,無條件捨去到整數,以下方的程式為例,圓周率 3.14159 無條件捨去後就等於 3 ( 單純四捨五入可使用內建函式 round,參考:round(x, y) )。

import math
pi = math.pi
print(math.floor(pi))   # 3

copysign(x, y)

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

fabs(x)

math.fabs(x) 使用後會回傳* x 的絕對值*,計算結果以浮點數 float 格式呈現。

import math
print(math.fabs(-10))    # 10.0

fmod(x, y)

math.fabs(x) 使用後會回傳* x 除以 y 的餘數*,計算結果以浮點數 float 格式呈現,如果要回傳整數,可使用 Python 數學計算 x % y 的語法。

import math
print(math.fmod(7,3))    # 1.0

fsum(iter)

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

gcd(x, y)

math.gcd(x, y) 使用後會回傳* x 和 y 的最大公約數* ( 同時可以整除 x 和 y 的最大整數 )。

import math
print(math.gcd(18,12))    # 6

pow(x, y)

math.pow(x, y) 會回傳* x 的 y 次方*,計算結果以浮點數 float 格式呈現 ( 如果需要整數,可參考內建函式 pow(x, y, z) )。

import math
print(math.pow(2, 5))    # 32.0

sqrt(x)

math.sqrt(x) 會回傳* x 的平方根*,計算結果以浮點數 float 格式呈現。

import math
print(math.sqrt(16))    # 4.0

factorial(x)

math.factorial(x) 會回傳 x 的階乘 ( x! ),x 只能使用正整數

import math
print(math.factorial(5))   # 120 ( 5x4x3x2x1=120 )

degrees(x)、math.radians(x)

math.degrees(x) 將 x 弧度轉換為角度,math.radians(x) 將 x 角度轉換為弧度。

import math
print(math.radians(30))      # 0.5235987755982988
print(math.degrees(0.5236))  # 30.0000701530499

sin(x)、math.cos(x)、math.tan(x)

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

asin(x)、math.acos(x)、math.atan(x)

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

exp(x)

math.exp(x) 會回傳 e 常數的 x 次方。

import math
print(math.exp(2))    # 7.38905609893065

log(x)、math.log1p(x)、math.log2(x)、math.log10(x)

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

isclose(x, y, rel_tol, abs_tol)

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

isfinite(x)、math.isinf(x)

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

isnan(x)

math.isnan(x) 能判斷 x 是否為 NaN ( 非數字 ),回傳 True 或 False。

import math
a = float('nan')
print(math.isnan(a))     # True
print(math.isnan(123))   # False

更多教學

大家好,我是 OXXO,是個即將邁入中年的斜槓青年,我有個超過一千篇教學的 STEAM 教育學習網,有興趣可以參考下方連結呦~ ^_^


上一篇
( Day 17.2 ) Python 裝飾器 decorator
下一篇
( Day 18.2 ) Python 數學統計函式 statistics
系列文
跟著 OXXO 一起學 Python101
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
hlb
iT邦新手 5 級 ‧ 2023-11-01 19:37:24

對於 math.isclose() 函數,當不提供 rel_tolabs_tol 參數時,其預設值為 rel_tol=1e-09abs_tol=0.0

你的範例 print(math.isclose(3.14000, 3.14001)) # True 應該返回 False 而不是 True。

我要留言

立即登入留言