Julia 數(shù)學(xué)運算和基本函數(shù)

2022-02-25 16:44 更新

Julia 為它所有的基礎(chǔ)數(shù)值類型,提供了整套的基礎(chǔ)算術(shù)和位運算,也提供了一套高效、可移植的標準數(shù)學(xué)函數(shù)。

算術(shù)運算符

下面的算術(shù)運算符適用于所有的基本數(shù)值類型:

表達式 名稱 描述
+x 一元加法 x 本身
-x 一元減法 相反數(shù)
x + y 二元加法 做加法
x - y 二元減法 做減法
x * y 乘法 做乘法
x / y 除法 做除法
x \ y 反除 等價于 y / x
x ^ y 乘方 x 的 y 次冪
x % y 取余 等價于 rem(x, y)

以及 Bool 類型的非運算:

表達式 名稱 描述
!x true 和 false 互換

Julia 的類型提升系統(tǒng)使得參數(shù)類型混雜的算術(shù)運算也很簡單自然。詳見類型轉(zhuǎn)換和類型提升 。

算術(shù)運算的例子:

julia> 1 + 2 + 3
6

julia> 1 - 2
-1

julia> 3*2/12
0.5

(習慣上,優(yōu)先級低的運算,前后多補些空格。這不是強制的。)

位運算符

下面的 位運算符 適用于所有整數(shù)類型:

表達式 名稱
~x 按位取反
x & y 按位與
x \| y 按位或
x $ y 按位異或
x >>> y 向右 邏輯移位 (高位補 0 )
x >> y 向右 算術(shù)移位 (復(fù)制原高位)
x << y 向左邏輯/算術(shù)移位

位運算的例子:

julia> ~123
-124

julia> 123 & 234
106

julia> 123 | 234
251

julia> 123 $ 234
145

julia> ~uint32(123)
0xffffff84

julia> ~uint8(123)
0x84

復(fù)合賦值運算符

二元算術(shù)和位運算都有對應(yīng)的復(fù)合賦值運算符,即運算的結(jié)果將會被賦值給左操作數(shù)。在操作符的后面直接加上 = 就組成了復(fù)合賦值運算符。例如, x += 3 相當于 x = x + 3

julia> x = 1
1

julia> x += 3
4

julia> x
4

復(fù)合賦值運算符有:

+=  -=  *=  /=  \=  %=  ^=  &=  |=  $=  >>>=  >>=  <<=

數(shù)值比較

所有的基礎(chǔ)數(shù)值類型都可以使用比較運算符:

運算符 名稱
== 等于
!= 不等于
< 小于
<= 小于等于
> 大于
>= 大于等于

一些例子:

julia> 1 == 1
true

julia> 1 == 2
false

julia> 1 != 2
true

julia> 1 == 1.0
true

julia> 1 < 2
true

julia> 1.0 > 3
false

julia> 1 >= 1.0
true

julia> -1 <= 1
true

julia> -1 <= -1
true

julia> -1 <= -2
false

julia> 3 < -0.5
false

整數(shù)是按位比較的。浮點數(shù)是 IEEE 754 標準 比較的:

  • 有限數(shù)按照正常方式做比較。
  • 正數(shù)的零等于但不大于負數(shù)的零。
  • Inf 等于它本身,并且大于所有數(shù), 除了 NaN。
  • -Inf 等于它本身,并且小于所有數(shù), 除了 NaN
  • NaN 不等于、不大于、不小于任何數(shù),包括它本身。

上面最后一條是關(guān)于 NaN 的性質(zhì),值得留意:

julia> NaN == NaN
false

julia> NaN != NaN
true

julia> NaN < NaN
false

julia> NaN > NaN
false

NaN矩陣中使用時會帶來些麻煩:

julia> [1 NaN] == [1 NaN]
false

Julia 提供了附加函數(shù), 用以測試這些特殊值,它們使用哈希值來比較:

函數(shù) 測試
isequal(x, y) x 是否等價于 y
isfinite(x) x 是否為有限的數(shù)
isinf(x) x 是否為無限的數(shù)
isnan(x) x 是否不是數(shù)

isequal 函數(shù),認為 NaN 等于它本身:

julia> isequal(NaN,NaN)
true

julia> isequal([1 NaN], [1 NaN])
true

julia> isequal(NaN,NaN32)
true

isequal 也可以用來區(qū)分有符號的零:

julia> -0.0 == 0.0
true

julia> isequal(-0.0, 0.0)
false

鏈式比較

與大多數(shù)語言不同,Julia 支持 Python鏈式比較

julia> 1 < 2 <= 2 < 3 == 3 > 2 >= 1 == 1 < 3 != 5
true

對標量的比較,鏈式比較使用 && 運算符;對逐元素的比較使用 & 運算符,此運算符也可用于數(shù)組。例如, 0 .< A .< 1 的結(jié)果是一個對應(yīng)的布爾數(shù)組,滿足條件的元素返回 true 。

操作符 .< 是特別針對數(shù)組的; 只有當 AB 有著相同的大小時, A .< B 才是合法的。比較的結(jié)果是布爾型數(shù)組, 其大小同 AB 相同. 這樣的操作符被稱為按元素操作符; Julia 提供了一整套的按元素操作符: .*, .+, 等等。 有的按元素操作符也可以接受純量, 例如上一段的 0 .< A .< B. 這種表示法的意思是, 相應(yīng)的純量操作符會被施加到每一 個元素上去。

注意鏈式比較的比較順序:

v(x) = (println(x); x)

julia> v(1) < v(2) <= v(3)
2
1
3
true

julia> v(1) > v(2) <= v(3)
2
1
false

中間的值只計算了一次,而不是像 v(1) < v(2) && v(2) <= v(3) 一樣計算了兩次。但是,鏈式比較的計算順序是不確定的。不要在鏈式比較中使用帶副作用(比如打?。┑谋磉_式。如果需要使用副作用表達式,推薦使用短路 && 運算符(詳見短路求值)。

運算優(yōu)先級

Julia 運算優(yōu)先級從高至低依次為:

類型 運算符
語法 . 跟隨 ::
^.^ 等效
分數(shù) //.//
乘除 / % & \.* ./ .% .\
位移 << >> >>>.<< .>> .>>>
加減 + - | $.+ .-
語法 : .. 跟隨于 |>
比較 > < >= <= == === != !== <:.> .< .>= .<= .== .!=
邏輯 && 跟隨于 || 跟隨于 ?
賦值 = += -= *= /= //= \= ^= %= \|= &= $= <<= >>= >>>=.+= .-= .*= ./= .//= .\= .^= .%=

基本函數(shù)

Julia 提供了一系列數(shù)學(xué)函數(shù)和運算符:

舍入函數(shù)

函數(shù) 描述 返回類型
round(x) 把 x 舍入到最近的整數(shù) FloatingPoint
iround(x) 把 x 舍入到最近的整數(shù) Integer
floor(x) 把 x 向 -Inf 取整 FloatingPoint
ifloor(x) 把 x 向 -Inf 取整 Integer
ceil(x) 把 x 向 +Inf 取整 FloatingPoint
iceil(x) 把 x 向 +Inf 取整 Integer
trunc(x) 把 x 向 0 取整 FloatingPoint
itrunc(x) 把 x 向 0 取整 Integer

除法函數(shù)

函數(shù) 描述
div(x,y) 截斷取整除法;商向 0 舍入
fld(x,y) 向下取整除法;商向 -Inf 舍入
cld(x,y) 向上取整除法; 商向 +Inf 舍入
rem(x,y) 除法余數(shù);滿足 x == div(x,y)*y + rem(x,y) ,與 x 同號
divrem(x,y) 返回 (div(x,y),rem(x,y))
mod(x,y) 取模余數(shù);滿足 x == fld(x,y)*y + mod(x,y) ,與 y 同號
mod2pi(x) 對 2pi 取模余數(shù); 0 <= mod2pi(x) < 2pi
gcd(x,y...) x, y, ... 的最大公約數(shù),與 x 同號
lcm(x,y...) x, y, ... 的最小公倍數(shù),與 x 同號

符號函數(shù)和絕對值函數(shù)

函數(shù) 描述
abs(x) x 的幅值
abs2(x) x 的幅值的平方
sign(x) x 的正負號,返回值為 -1, 0, 或 +1
signbit(x) 是否有符號位,有 (true) 或者 無 (false)
copysign(x,y) 返回一個數(shù),它具有 x 的幅值, y 的符號位
flipsign(x,y) 返回一個數(shù),它具有 x 的幅值, x*y 的符號位

乘方,對數(shù)和開方

函數(shù) 描述
sqrt(x) √x x 的平方根
cbrt(x) ?x x 的立方根
hypot(x,y) 誤差較小的 sqrt(x^2 + y^2)
exp(x) 自然指數(shù) e 的 x 次冪
expm1(x) 當 x 接近 0 時,精確計算 exp(x)-1
ldexp(x,n)  當 n 為整數(shù)時,高效計算x*2^n
log(x) x 的自然對數(shù)
log(b,x) 以 b 為底 x 的對數(shù)
log2(x) 以 2 為底 x 的對數(shù)
log10(x) 以 10 為底 x 的對數(shù)
log1p(x) 當 x 接近 0 時,精確計算 log(1+x)
exponent(x) trunc(log2(x))
significand(x) returns the binary significand (a.k.a. mantissa) of a floating-point number x

為什么要有 hypot, expm1, log1p 等函數(shù),參見 John D. Cook 的博客: expm1, log1p, erfchypot 。

三角函數(shù)和雙曲函數(shù)

Julia 內(nèi)置了所有的標準三角函數(shù)和雙曲函數(shù)

sin    cos    tan    cot    sec    csc
sinh   cosh   tanh   coth   sech   csch
asin   acos   atan   acot   asec   acsc
asinh  acosh  atanh  acoth  asech  acsch
sinc   cosc   atan2

除了 atan2 之外,都是單參數(shù)函數(shù)。 atan2 給出了 x 軸,與由 x 、 y 確定的點之間的弧度 。

另外,sinpi(x)cospi(x)各自被提供給更準確的 sin(pi*x)cos(pi*x)的計算。

如果想要以度,而非弧度,為單位計算三角函數(shù),應(yīng)使用帶 d 后綴的函數(shù)。例如,sind(x) 計算 x 的正弦值,這里 x 的單位是度。以下的列表是全部的以度為單位的三角函數(shù):

sind   cosd   tand   cotd   secd   cscd
asind  acosd  atand  acotd  asecd  acscd

特殊函數(shù)

函數(shù) 描述
erf(x) x 處的 誤差函數(shù)
erfc(x) 補誤差函數(shù)。當 x 較大時,精確計算 1-erf(x)
erfinv(x) erf 的反函數(shù)
erfcinv(x) erfc 的反函數(shù)
erfi(x) 將誤差函數(shù)定義為 -im erf(x im) ,其中 im 是虛數(shù)單位
erfcx(x) 縮放的互補誤差函數(shù),即對較大的 x 值的準確的 exp(x ^ 2)* erfc(x)
dawson(x) 縮放虛誤差函數(shù),又名道森函數(shù),即對較大的 x 值求精確的 exp(-x^2) erfi(x) sqrt(pi) / 2
gamma(x) x 處的 gamma 函數(shù)
lgamma(x) 當 x 較大時,精確計算 log(gamma(x))
lfact(x) 對較大的 x 求精確的 log(factorial(x)); 與對大于 1 的 x 值求 lgamma(x+1) 相等, 否則等于 0
digamma(x) x 處的 digamma 函數(shù),即導(dǎo)數(shù)的衍生
beta(x,y) 在(x,y)處的 beta 函數(shù)
lbeta(x,y) 對較大的 x 或 y 值求準確的 log(beta(x,y))
eta(x) x 處的 Dirichlet eta 函數(shù)
zeta(x) x 處的 Riemann zeta 函數(shù)
airy(z), airyai(z), airy(0,z) z 處的 Airy Ai 函數(shù)
airyprime(z), airyaiprime(z), airy(1,z) Airy Ai 函數(shù)在 z 處的導(dǎo)數(shù)
airybi(z), airy(2,z) z 處的 Airy Bi 函數(shù)
airybiprime(z), airy(3,z) Airy Bi 函數(shù)在 z 處的導(dǎo)數(shù)
airyx(z), airyx(k,z) 縮放 Airy Ai 函數(shù) 以及 k 對 z 的導(dǎo)數(shù)
besselj(nu,z) 對 z 中一階 nu 的貝塞爾函數(shù)
besselj0(z) besselj(0,z)
besselj1(z) besselj(1,z)
besseljx(nu,z) 對 z 中一階 nu 的縮放貝塞爾函數(shù)
bessely(nu,z) 對 z 中二階 nu 的貝塞爾函數(shù)
bessely0(z) bessely(0,z)
bessely1(z) bessely(1,z)
besselyx(nu,z) 對 z 中二階 nu 的縮放貝塞爾函數(shù)
besselh(nu,k,z) 對 z 中三階 nu (例如漢克爾函數(shù))的貝塞爾函數(shù); k 必須為 1 或 2
hankelh1(nu,z) besselh(nu, 1, z)
hankelh1x(nu,z) 縮放 besselh(nu, 1, z)
hankelh2(nu,z) besselh(nu, 2, z)
hankelh2x(nu,z) 縮放 besselh(nu, 2, z)
besseli(nu,z) 對 z 中一階 nu 的修正貝塞爾函數(shù)
besselix(nu,z) 對 z 中一階 nu 的縮放修正貝塞爾函數(shù)
besselk(nu,z) 對 z 中二階 nu 的修正貝塞爾函數(shù)
besselkx(nu,z) 對二階 o 的縮放修正貝塞爾函數(shù)


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號