1. 程式人生 > >數學運算模組:Python3.7的math模組與cmath模組

數學運算模組:Python3.7的math模組與cmath模組

數學運算模組:math與cmath

math模組

  • 其實不起眼的math里加進去了很多黑科技。

常規部分

math.ceil(x)

  • 向上取整
>>> import math
>>> math.ceil(0.0)
0
>>> math.ceil(0.1)
1
>>> math.ceil(41.1)
42

math.copysign(x, y)

  • copy符號
  • 返回x的絕對值和y的符號(對不起,這是我和他的孩子)
>>> import math
>>> 
math.copysign(1, -0.0) -1.0 >>> math.copysign(-1, 0.0) 1.0 >>> math.copysign(-1, -0.0) -1.0 >>> math.copysign(1, 0) 1.0

math.fabs(x)

  • 返回絕對值
  • math.fabs()與內建函式abs()的區別:
    • fabs需要import math後才能呼叫,abs可以直接使用
    • abs可以用於複數而fabs不可以。
>>> math.fabs(-8)
8.0
>>> abs(-8)
8
>>> abs
(1+1.0j) 1.4142135623730951 >>> math.fabs(1+1.0j) Traceback (most recent call last): File "<pyshell#12>", line 1, in <module> math.fabs(1+1.0j) TypeError: can't convert complex to float

math.factorial(x)

  • 這個函式竟然可以返回x!
  • 2乘3竟然等於3!
  • (返回x的階乘)
>>> math.factorial(3)
6
>>> math.factorial(10) 3628800

math.floor(x)

  • 向下取整
>>> math.floor(0.0)
0
>>> math.floor(0.1)
0
>>> math.floor(-0.1)
-1
>>> math.floor(42.9)
42

math.fmod(x, y)

  • 取模運算
  • 與路人運算子號%的區別:
    • fmod預設返回浮點數
    • 對於x、y符號一致時,%與fmod結果一致
    • 但x、y符號不一致時,結果不同
    • 詳見取模運算
>>> 3%2
1
>>> 3%-2
-1
>>> -3%2
1
>>> 3.1%3
0.10000000000000009
>>> math.fmod(3, 2)
1.0
>>> math.fmod(3, -2)
1.0
>>> math.fmod(-3, 2)
-1.0
>>> math.fmod(3.1, 3)
0.10000000000000009
>>> math.fmod(-7, 4)
-3.0
>>> (-7)%4
1
>>> math.fmod(-7, -4)
-3.0
>>> (-7)%(-4)
-3

math.frexp(x)

  • 將x分解為尾數與指數
    x = 尾數 * 2^指數
>>> math.frexp(3)
(0.75, 2)
>>> 0.75*2**2
3.0
>>> math.frexp(32)
(0.5, 6)
>>> 0.5*2**6
32.0
>>> math.frexp(-32)
(-0.5, 6)

math.fsum(iterable)

  • 功能同內建函式sum(),但精度更高
>>> sum([.1, .1, .1, .1, .1, .1, .1, .1, .1, .1])
0.9999999999999999
>>> fsum([.1, .1, .1, .1, .1, .1, .1, .1, .1, .1])
1.0

math.gcd(a, b)

  • 一鍵返回最大公約數
>>> math.gcd(32, 33)
1
>>> math.gcd(32, 34)
2
>>> math.gcd(32, 64)
32

math.isclose(a, b, *, rel_tol=1e-09, abs_tol=0.0)

  • “接近”判斷
    abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)

  • 若:

    • rel_tol=x
    • abs_tol=y
  • math.isclose(a, b, rel_tol=x, abs_tol=y)翻譯成:
    • a與b“接近”的判定條件是:
      • a與b的差距是否小於ab較大的那個乘以x
      • 或ab差距小於y
    • 翻譯v2:
      • ab,你和你女朋友
      • x你們的感情
      • y有沒有房
      • “你和你女朋友會不會結婚取決於你們的感情或你們有沒有房。”
>>> math.isclose(3,5,rel_tol=0.2, abs_tol=0.0)
False
>>> math.isclose(3,5,rel_tol=0.5, abs_tol=0.0)
True
>>> math.isclose(3,5,rel_tol=0.2, abs_tol=2.0)
True

math.isfinite(x)

  • 判斷x有限或者不是nan
>>> math.isfinite(float('nan'))
False
>>> math.isfinite(float('NaN'))
False
>>> math.isfinite(1)
True

math.isinf(x)

  • 判斷x是否為正負無限

math.isnan(x)

  • 判斷x是否為nan

math.ldexp(x, i)

  • math.frexp(x)的逆運算
>>> math.frexp(32)
(0.5, 6)
>>> math.ldexp(0.5, 6)
32.0

math.modf(x)

  • 分離x的整數和小數部分
>>> math.modf(3.1)
(0.10000000000000009, 3.0)
>>> math.modf(-3.3)
(-0.2999999999999998, -3.0)

math.remainder(x, y)

  • 符合IEEE 754標準的求餘……
>>> math.remainder(5, 2)
1.0
>>> math.remainder(-7, 4)
1.0
>>> math.remainder(-7, -4)
1.0
>>> math.remainder(7, 4)
-1.0
>>> math.remainder(7, -4)
-1.0

math.trunc(x)

  • 截斷x的小數部分
>>> math.trunc(32)
32
>>> math.trunc(32.1)
32
>>> math.trunc(32.00000000001)
32
>>> math.trunc(-233.2)
-233

指數、對數部分

math.exp(x)

  • e為底的指數
>>> math.exp(0)
1.0
>>> math.exp(1)
2.718281828459045

math.expm1(x)

  • math.expm1(x)=exp(x) - 1
>>> math.expm1(0)
0.0
>>> math.expm1(1)
1.718281828459045

math.log(x[, base])

  • 對數
>>> math.log(math.e,math.e)
1.0
>>> math.log(1,math.e)
0.0

math.log1p(x)

  • math.log1p(x)=math.log(x+1,math.e)
>>> math.log1p(math.e-1)
1.0
>>> math.log1p(0)
0.0

math.log2(x)

  • 二為底數
>>> math.log2(4)
2.0
>>> math.log2(1024)
10.0

math.log10(x)

  • 十為底數
>>> math.log10(10)
1.0
>>> math.log10(10000)
4.0

math.pow(x, y)

  • 指數運算
>>> math.pow(2, 0)
1.0
>>> math.pow(2, 10)
1024.0

math.sqrt(x)

  • 平方根運算
>>> math.sqrt(4)
2.0
>>> math.sqrt(16)
4.0

三角函式部分

  • 運算函式皆預設以弧度值返回。

math.degrees(x)與math.radians(x)

  • 角度與弧度的互換

math.acos(x)

  • arc cosine

math.asin(x)

  • arc sine

math.atan(x)

  • arc tangent

math.atan2(y, x)

  • 方便調節圓上計算路徑的math.atan(x)

math.cos(x)

  • cosine

math.sin(x)

  • sine

math.tan(x)

  • tangent

math.hypot(x, y)

  • 勾股定理求斜邊
>>> math.hypot(3, 4)
5.0

math.acosh(x)

  • inverse hyperbolic cosine of x

math.asinh(x)

  • inverse hyperbolic sine of x

math.atanh(x)

  • inverse hyperbolic tangent of x

math.cosh(x)

  • hyperbolic cosine of x

math.sinh(x)

  • hyperbolic sine of x

math.tanh(x)

  • hyperbolic tangent of x

特殊函式部分

math.erf(x)

  • 返回x處的誤差函式

math.erfc(x)

  • 返回x處的互補誤差函式
  • math.erfc(x)= 1.0-math.erf(x)

math.gamma(x)

  • 返回x處的gamma函式

math.lgamma(x)

  • 返回x處的自然對數gamma函式
>>> math.log(math.gamma(3))
0.6931471805599453
>>> math.lgamma(3)
0.693147180559945

常數部分

math.pi

  • 宇宙真理1

math.e

  • 宇宙真理2

math.tau

  • 兩倍的宇宙真理1
  • math.tau=math.pi*2

math.inf

  • 正無窮,加個負號變負無窮
  • 可以直接用float(‘inf’)表達
>>> math.isinf(float('inf'))
True
>>> math.isinf(math.inf)
True

math.nan

  • not a number
  • 一般見於上限爆了等神祕操作
  • 可直接用float(‘nan’)表達

cmath模組

  • cmath模組旨在進行復數運算。
  • 這一部分用到的就很少了。

座標轉換

cmath.phase(x)

  • 複數的角度
>>> phase(complex(-1.0, 0.0))
3.141592653589793
>>> phase(complex(-1.0, -0.0))
-3.141592653589793

cmath.polar(x)

  • 複數轉為極座標
  • polar(x)=(abs(x), phase(x))

cmath.rect(r, phi)

  • 極座標轉換成普通複數形式
    r * (math.cos(phi) + math.sin(phi)*1j)

指數對數部分

cmath.exp(x)

  • 複數版本

cmath.log(x[, base])

  • 複數版本

cmath.log10(x)

  • 複數版本

cmath.sqrt(x)

  • 複數版本

三角函式部分

cmath.acos(x)

  • 複數版本

cmath.asin(x)

  • 複數版本

cmath.atan(x)

  • 複數版本

cmath.cos(x)

  • 複數版本

cmath.sin(x)

  • 複數版本

cmath.tan(x)

  • 複數版本

cmath.acosh(x)

  • 複數版本

cmath.asinh(x)

  • 複數版本

cmath.atanh(x)

  • 複數版本

cmath.cosh(x)

  • 複數版本

cmath.sinh(x)

  • 複數版本

cmath.tanh(x)

  • 複數版本

判斷部分

cmath.isfinite(x)

  • 實虛全有限才為True

cmath.isinf(x)

  • 實虛任意一個為infinity即為True

cmath.isnan(x)

  • 實虛任意一個為nan即為True

cmath.isclose(a, b, *, rel_tol=1e-09, abs_tol=0.0)

  • 同math版本,用abs比較故不受影響

常數部分

cmath.pi

  • 同math版本

cmath.e

  • 同math版本

cmath.tau

  • 同math版本

cmath.inf

  • 同math版本

cmath.infj

  • inf的虛部版本
    complex(0.0, float(‘inf’))

cmath.nan

  • 同math版本

cmath.nanj

  • nan虛部版本
    complex(0.0, float(‘nan’))