math --- 數學函式


此模組提供對 C 標準中定義的數學相關函式的存取。

這些函式不支援複數;若你需要計算複數,請使用cmath 模組的同名函式。這是因為大多數的使用者並不想學習那麼多理解複數所需的數學概念,所以根據支援複數與否分為兩種函式。收到一個例外而非複數回傳值,有助於程式設計師提早察覺參數中包含非預期的複數,進而從源頭查出導致此情況的原因。

此模組提供下列函式。除非特意註明,否則回傳值皆為浮點數。

數論函式

comb(n,k)

n 個物品中不重複且不考慮排序地取出k 個物品的方法數。

factorial(n)

n factorial

gcd(*integers)

Greatest common divisor of the integer arguments

isqrt(n)

Integer square root of a nonnegative integern

lcm(*integers)

Least common multiple of the integer arguments

perm(n,k)

n 個物品中不重複但考慮排序地取出k 個物品的方法數。

Floating point arithmetic

ceil(x)

Ceiling ofx, the smallest integer greater than or equal tox

fabs(x)

x 的絕對值。

floor(x)

Floor ofx, the largest integer less than or equal tox

fma(x,y,z)

Fused multiply-add operation:(x*y)+z

fmod(x,y)

Remainder of divisionx/y

modf(x)

Fractional and integer parts ofx

remainder(x,y)

Remainder ofx with respect toy

trunc(x)

Integer part ofx

浮點數操作函式

copysign(x,y)

Magnitude (absolute value) ofx with the sign ofy

frexp(x)

Mantissa and exponent ofx

isclose(a,b,rel_tol,abs_tol)

Check if the valuesa andb are close to each other

isfinite(x)

Check ifx is neither an infinity nor a NaN

isinf(x)

Check ifx is a positive or negative infinity

isnan(x)

Check ifx is a NaN (not a number)

ldexp(x,i)

x*(2**i), inverse of functionfrexp()

nextafter(x,y,steps)

Floating-point valuesteps steps afterx towardsy

ulp(x)

Value of the least significant bit ofx

Power, exponential and logarithmic functions

cbrt(x)

Cube root ofx

exp(x)

e raised to the powerx

exp2(x)

2 raised to the powerx

expm1(x)

e raised to the powerx, minus 1

log(x,base)

Logarithm ofx to the given base (e by default)

log1p(x)

Natural logarithm of1+x (basee)

log2(x)

Base-2 logarithm ofx

log10(x)

Base-10 logarithm ofx

pow(x,y)

x raised to the powery

sqrt(x)

x 的平方根

Summation and product functions

dist(p,q)

Euclidean distance between two pointsp andq given as an iterable of coordinates

fsum(iterable)

Sum of values in the inputiterable

hypot(*coordinates)

Euclidean norm of an iterable of coordinates

prod(iterable,start)

Product of elements in the inputiterable with astart value

sumprod(p,q)

Sum of products from two iterablesp andq

Angular conversion

degrees(x)

Convert anglex from radians to degrees

radians(x)

Convert anglex from degrees to radians

Trigonometric functions

acos(x)

Arc cosine ofx

asin(x)

Arc sine ofx

atan(x)

Arc tangent ofx

atan2(y,x)

atan(y/x)

cos(x)

Cosine ofx

sin(x)

Sine ofx

tan(x)

Tangent ofx

Hyperbolic functions

acosh(x)

Inverse hyperbolic cosine ofx

asinh(x)

Inverse hyperbolic sine ofx

atanh(x)

Inverse hyperbolic tangent ofx

cosh(x)

Hyperbolic cosine ofx

sinh(x)

Hyperbolic sine ofx

tanh(x)

Hyperbolic tangent ofx

Special functions

erf(x)

Error function atx

erfc(x)

Complementary error function atx

gamma(x)

Gamma function atx

lgamma(x)

Natural logarithm of the absolute value of theGamma function atx

常數

pi

π = 3.141592...

e

e = 2.718281...

tau

τ = 2π = 6.283185...

inf

正無限大

nan

"Not a number" (NaN)

數論函式

math.comb(n,k)

回傳從n 個物品中不重複且不考慮排序地取出k 個物品的方法數。

k<=n 時其值為n!/(k!*(n-k)!),否則其值為0

因為此值等同於(1+x)ⁿ 進行多項式展開後第 k 項的係數,所以又稱為二項式係數。

當任一參數非整數型別時會引發TypeError。當任一參數為負數時會引發ValueError

在 3.8 版被加入.

math.factorial(n)

Return factorial of the nonnegative integern.

在 3.10 版的變更:其值為整數的浮點數(如:5.0)已不再被接受。

math.gcd(*integers)

回傳指定整數引數的最大公因數。若存在任一非零引數,回傳值為所有引數共有因數中最大的正整數。若所有引數皆為零,則回傳值為0gcd() 若未傳入任何引數也將回傳0

在 3.5 版被加入.

在 3.9 版的變更:新增支援任意數量的引數。先前僅支援兩個引數。

math.isqrt(n)

回傳非負整數n 的整數平方根。此值為n 精確平方根經下取整的值,亦等同於滿足a² ≤ n 的最大整數值a

於有些應用程式中,取得滿足n ≤ a² 的最小整數值a ── 或者說n 精確平方根經上取整的值 ── 會更加方便。對正數n,此值可使用a=1+isqrt(n-1) 計算。

在 3.8 版被加入.

math.lcm(*integers)

回傳指定整數引數的最小公倍數。若所有引數值皆非零,回傳值為所有引數共有倍數中最小的正整數。若存在任一引數值為零,則回傳值為0lcm() 若未傳入任何引數將回傳1

在 3.9 版被加入.

math.perm(n,k=None)

Return the number of ways to choosek items fromn itemswithout repetition and with order.

Evaluates ton!/(n-k)! whenk<=n and evaluatesto zero whenk>n.

Ifk is not specified or isNone, thenk defaults tonand the function returnsn!.

當任一參數非整數型別時會引發TypeError。當任一參數為負數時會引發ValueError

在 3.8 版被加入.

Floating point arithmetic

math.ceil(x)

回傳x 經上取整的值,即大於或等於x 的最小整數。若x 並非浮點數,此函式將委派給x.__ceil__,並回傳Integral 型別的值。

math.fabs(x)

回傳x 的絕對值。

math.floor(x)

回傳x 經下取整的值,即小於或等於x 的最大整數。若x 並非浮點數,此函式將委派給x.__floor__,並回傳Integral 型別的值。

math.fma(x,y,z)

Fused multiply-add operation. Return(x*y)+z, computed as though withinfinite precision and range followed by a single round to thefloatformat. This operation often provides better accuracy than the directexpression(x*y)+z.

This function follows the specification of the fusedMultiplyAdd operationdescribed in the IEEE 754 standard. The standard leaves one caseimplementation-defined, namely the result offma(0,inf,nan)andfma(inf,0,nan). In these cases,math.fma returns a NaN,and does not raise any exception.

在 3.13 版被加入.

math.fmod(x,y)

回傳x/y 的浮點數餘數,其以平臺上的 C 函式庫fmod(x,y) 函式定義。請注意此函式與 Python 運算式x%y 可能不會回傳相同結果。C 標準要求fmod(x,y) 的回傳值完全等同(數學定義上,即無限精度)於x-n*yn 為可使回傳值與x 同號且長度小於abs(y) 的整數。Python 運算式x%y 的回傳值則與y 同號,且可能無法精確地計算浮點數引數。例如:fmod(-1e-100,1e100) 的值為-1e-100,但 Python 運算式-1e-100%1e100 的結果為1e100-1e-100,此值無法準確地表示成浮點數,並會四捨五入為出乎意料的1e100。因此,處理浮點數時通常會選擇函式fmod(),而處理整數時會選擇 Python 運算式x%y

math.modf(x)

Return the fractional and integer parts ofx. Both results carry the signofx and are floats.

Note thatmodf() has a different call/return patternthan its C equivalents: it takes a single argument and return a pair ofvalues, rather than returning its second return value through an 'outputparameter' (there is no such thing in Python).

math.remainder(x,y)

Return the IEEE 754-style remainder ofx with respect toy. Forfinitex and finite nonzeroy, this is the differencex-n*y,wheren is the closest integer to the exact value of the quotientx/y. Ifx/y is exactly halfway between two consecutive integers, thenearesteven integer is used forn. The remainderr=remainder(x,y) thus always satisfiesabs(r)<=0.5*abs(y).

Special cases follow IEEE 754: in particular,remainder(x,math.inf) isx for any finitex, andremainder(x,0) andremainder(math.inf,x) raiseValueError for any non-NaNx.If the result of the remainder operation is zero, that zero will havethe same sign asx.

On platforms using IEEE 754 binary floating point, the result of thisoperation is always exactly representable: no rounding error is introduced.

在 3.7 版被加入.

math.trunc(x)

Returnx with the fractional partremoved, leaving the integer part. This rounds toward 0:trunc() isequivalent tofloor() for positivex, and equivalent toceil()for negativex. Ifx is not a float, delegates tox.__trunc__, which should return anIntegral value.

For theceil(),floor(), andmodf() functions, note thatallfloating-point numbers of sufficiently large magnitude are exact integers.Python floats typically carry no more than 53 bits of precision (the same as theplatform C double type), in which case any floatx withabs(x)>=2**52necessarily has no fractional bits.

Floating point manipulation functions

math.copysign(x,y)

回傳與x 相同長度(絕對值)且與y 同號的浮點數。在支援帶符號零的平臺上,copysign(1.0,-0.0) 回傳-1.0

math.frexp(x)

(m,e) 對的格式回傳x 的尾數m 及指數em 是浮點數而e 是整數,且兩者精確地使x==m*2**e。若x 為零,回傳(0.0,0),否則令0.5<=abs(m)<1。此函式用於以可攜的方式「分割」浮點數內部表示法。

Note thatfrexp() has a different call/return patternthan its C equivalents: it takes a single argument and return a pair ofvalues, rather than returning its second return value through an 'outputparameter' (there is no such thing in Python).

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

ab 兩值足夠接近便回傳True,否則回傳False

兩數是否足夠接近取決於給定的絕對及相對容許偏差 (tolerance)。如果沒有錯誤發生,結果將為:abs(a-b)<=max(rel_tol*max(abs(a),abs(b)),abs_tol)

rel_tol 為相對容許偏差 ──ab 兩數差的最大容許值,與ab 兩數的絕對值中較大者相關。例如欲設置 5% 的容許偏差,則傳入rel_tol=0.05。其預設值為1e-09,該值可確保兩數於大約 9 個十進數位內相同。rel_tol 須不為負且小於1.0

abs_tol is the absolute tolerance; it defaults to0.0 and it must benonnegative. When comparingx to0.0,isclose(x,0) is computedasabs(x)<=rel_tol *abs(x), which isFalse for any nonzerox andrel_tol less than1.0. So add an appropriate positiveabs_tol argumentto the call.

定義於 IEEE 754 浮點標準中的特殊值NaNinf-inf 會根據該標準處理。更明確地說,NaN 不會與包含自身在內的任何數字足夠接近,而inf-inf 皆只與自身接近。

在 3.5 版被加入.

也參考

PEP 485 ── 用於測試近似相等的函式

math.isfinite(x)

x 不是無限值或NaN 便回傳True,否則回傳False。(注意0.0 被視為有限數。)

在 3.2 版被加入.

math.isinf(x)

x 是正無限值或負無限值便回傳True,否則回傳False

math.isnan(x)

xNaN ── 即非數字(NaN, not a number)── 便回傳True,否則回傳False

math.ldexp(x,i)

回傳x*(2**i)。此函式本質上為frexp() 的反函式。

math.nextafter(x,y,steps=1)

Return the floating-point valuesteps steps afterx towardsy.

Ifx is equal toy, returny, unlesssteps is zero.

範例:

  • math.nextafter(x,math.inf) goes up: towards positive infinity.

  • math.nextafter(x,-math.inf) goes down: towards minus infinity.

  • math.nextafter(x,0.0) goes towards zero.

  • math.nextafter(x,math.copysign(math.inf,x)) goes away from zero.

另請參閱math.ulp()

在 3.9 版被加入.

在 3.12 版的變更:新增steps 引數。

math.ulp(x)

Return the value of the least significant bit of the floatx:

  • Ifx is a NaN (not a number), returnx.

  • x 為負值,回傳ulp(-x)

  • x 為正無限值,回傳x

  • Ifx is equal to zero, return the smallest positivedenormalized representable float (smaller than the minimum positivenormalized float,sys.float_info.min).

  • Ifx is equal to the largest positive representable float,return the value of the least significant bit ofx, such that the firstfloat smaller thanx isx-ulp(x).

  • Otherwise (x is a positive finite number), return the value of the leastsignificant bit ofx, such that the first float bigger thanxisx+ulp(x).

ULP stands for "Unit in the Last Place".

See alsomath.nextafter() andsys.float_info.epsilon.

在 3.9 版被加入.

Power, exponential and logarithmic functions

math.cbrt(x)

Return the cube root ofx.

在 3.11 版被加入.

math.exp(x)

Returne raised to the powerx, wheree = 2.718281... is the baseof natural logarithms. This is usually more accurate thanmath.e**xorpow(math.e,x).

math.exp2(x)

Return2 raised to the powerx.

在 3.11 版被加入.

math.expm1(x)

Returne raised to the powerx, minus 1. Heree is the base of naturallogarithms. For small floatsx, the subtraction inexp(x)-1can result in asignificant loss of precision; theexpm1()function provides a way to compute this quantity to full precision:

>>>frommathimportexp,expm1>>>exp(1e-5)-1# gives result accurate to 11 places1.0000050000069649e-05>>>expm1(1e-5)# result accurate to full precision1.0000050000166668e-05

在 3.2 版被加入.

math.log(x[,base])

With one argument, return the natural logarithm ofx (to basee).

With two arguments, return the logarithm ofx to the givenbase,calculated aslog(x)/log(base).

math.log1p(x)

Return the natural logarithm of1+x (basee). Theresult is calculated in a way which is accurate forx near zero.

math.log2(x)

Return the base-2 logarithm ofx. This is usually more accurate thanlog(x,2).

在 3.3 版被加入.

也參考

int.bit_length() returns the number of bits necessary to representan integer in binary, excluding the sign and leading zeros.

math.log10(x)

Return the base-10 logarithm ofx. This is usually more accuratethanlog(x,10).

math.pow(x,y)

Returnx raised to the powery. Exceptional cases followthe IEEE 754 standard as far as possible. In particular,pow(1.0,x) andpow(x,0.0) always return1.0, evenwhenx is a zero or a NaN. If bothx andy are finite,x is negative, andy is not an integer thenpow(x,y)is undefined, and raisesValueError.

Unlike the built-in** operator,math.pow() converts bothits arguments to typefloat. Use** or the built-inpow() function for computing exact integer powers.

在 3.11 版的變更:The special casespow(0.0,-inf) andpow(-0.0,-inf) werechanged to returninf instead of raisingValueError,for consistency with IEEE 754.

math.sqrt(x)

Return the square root ofx.

Summation and product functions

math.dist(p,q)

Return the Euclidean distance between two pointsp andq, eachgiven as a sequence (or iterable) of coordinates. The two pointsmust have the same dimension.

Roughly equivalent to:

sqrt(sum((px-qx)**2.0forpx,qxinzip(p,q)))

在 3.8 版被加入.

math.fsum(iterable)

回傳可疊代物件(iterable)中所有值的精確浮點數和。透過追蹤過程中多個部分和(partial sum)以避免精確度損失。

此演算法準確性奠基於保證 IEEE-754 浮點標準及典型奇進偶捨(half-even)模式。於有些非 Windows 平台建置時,底層 C 函式庫使用延伸精度加法運算,而可能導致對過程中同一部分和重複捨入,並使其最低有效位不如預期。

更深入的討論及兩種替代做法請參閱ASPN cookbook recipes 精準的浮點數總和

math.hypot(*coordinates)

Return the Euclidean norm,sqrt(sum(x**2forxincoordinates)).This is the length of the vector from the origin to the pointgiven by the coordinates.

For a two dimensional point(x,y), this is equivalent to computingthe hypotenuse of a right triangle using the Pythagorean theorem,sqrt(x*x+y*y).

在 3.8 版的變更:Added support for n-dimensional points. Formerly, only the twodimensional case was supported.

在 3.10 版的變更:Improved the algorithm's accuracy so that the maximum error isunder 1 ulp (unit in the last place). More typically, the resultis almost always correctly rounded to within 1/2 ulp.

math.prod(iterable,*,start=1)

Calculate the product of all the elements in the inputiterable.The defaultstart value for the product is1.

When the iterable is empty, return the start value. This function isintended specifically for use with numeric values and may rejectnon-numeric types.

在 3.8 版被加入.

math.sumprod(p,q)

Return the sum of products of values from two iterablesp andq.

RaisesValueError if the inputs do not have the same length.

Roughly equivalent to:

sum(itertools.starmap(operator.mul,zip(p,q,strict=True)))

For float and mixed int/float inputs, the intermediate productsand sums are computed with extended precision.

在 3.12 版被加入.

Angular conversion

math.degrees(x)

Convert anglex from radians to degrees.

math.radians(x)

Convert anglex from degrees to radians.

Trigonometric functions

math.acos(x)

Return the arc cosine ofx, in radians. The result is between0 andpi.

math.asin(x)

Return the arc sine ofx, in radians. The result is between-pi/2 andpi/2.

math.atan(x)

Return the arc tangent ofx, in radians. The result is between-pi/2 andpi/2.

math.atan2(y,x)

Returnatan(y/x), in radians. The result is between-pi andpi.The vector in the plane from the origin to point(x,y) makes this anglewith the positive X axis. The point ofatan2() is that the signs of bothinputs are known to it, so it can compute the correct quadrant for the angle.For example,atan(1) andatan2(1,1) are bothpi/4, butatan2(-1,-1) is-3*pi/4.

math.cos(x)

Return the cosine ofx radians.

math.sin(x)

Return the sine ofx radians.

math.tan(x)

Return the tangent ofx radians.

Hyperbolic functions

Hyperbolic functionsare analogs of trigonometric functions that are based on hyperbolasinstead of circles.

math.acosh(x)

Return the inverse hyperbolic cosine ofx.

math.asinh(x)

Return the inverse hyperbolic sine ofx.

math.atanh(x)

Return the inverse hyperbolic tangent ofx.

math.cosh(x)

Return the hyperbolic cosine ofx.

math.sinh(x)

Return the hyperbolic sine ofx.

math.tanh(x)

Return the hyperbolic tangent ofx.

特殊函式

math.erf(x)

Return theerror function atx.

Theerf() function can be used to compute traditional statisticalfunctions such as thecumulative standard normal distribution:

defphi(x):'Cumulative distribution function for the standard normal distribution'return(1.0+erf(x/sqrt(2.0)))/2.0

在 3.2 版被加入.

math.erfc(x)

Return the complementary error function atx. Thecomplementary errorfunction is defined as1.0-erf(x). It is used for large values ofx where a subtractionfrom one would cause aloss of significance.

在 3.2 版被加入.

math.gamma(x)

Return theGamma function atx.

在 3.2 版被加入.

math.lgamma(x)

Return the natural logarithm of the absolute value of the Gammafunction atx.

在 3.2 版被加入.

常數

math.pi

The mathematical constantπ = 3.141592..., to available precision.

math.e

The mathematical constante = 2.718281..., to available precision.

math.tau

The mathematical constantτ = 6.283185..., to available precision.Tau is a circle constant equal to 2π, the ratio of a circle's circumference toits radius. To learn more about Tau, check out Vi Hart's videoPi is (still)Wrong, and start celebratingTau day by eating twice as much pie!

在 3.6 版被加入.

math.inf

A floating-point positive infinity. (For negative infinity, use-math.inf.) Equivalent to the output offloat('inf').

在 3.5 版被加入.

math.nan

A floating-point "not a number" (NaN) value. Equivalent to the output offloat('nan'). Due to the requirements of theIEEE-754 standard,math.nan andfloat('nan') arenot considered to equal to any other numeric value, including themselves. To checkwhether a number is a NaN, use theisnan() function to testfor NaNs instead ofis or==.Example:

>>>importmath>>>math.nan==math.nanFalse>>>float('nan')==float('nan')False>>>math.isnan(math.nan)True>>>math.isnan(float('nan'))True

在 3.5 版被加入.

在 3.11 版的變更:It is now always available.

CPython 實作細節: Themath module consists mostly of thin wrappers around the platform Cmath library functions. Behavior in exceptional cases follows Annex F ofthe C99 standard where appropriate. The current implementation will raiseValueError for invalid operations likesqrt(-1.0) orlog(0.0)(where C99 Annex F recommends signaling invalid operation or divide-by-zero),andOverflowError for results that overflow (for example,exp(1000.0)). A NaN will not be returned from any of the functionsabove unless one or more of the input arguments was a NaN; in that case,most functions will return a NaN, but (again following C99 Annex F) thereare some exceptions to this rule, for examplepow(float('nan'),0.0) orhypot(float('nan'),float('inf')).

Note that Python makes no effort to distinguish signaling NaNs fromquiet NaNs, and behavior for signaling NaNs remains unspecified.Typical behavior is to treat all NaNs as though they were quiet.

也參考

cmath 模組

Complex number versions of many of these functions.