Julia 数学函数
Julia 提供了一套高效、可移植的标准数学函数。
数值比较函数
下表列出了用于数值比较的函数:
| 函数 | 测试是否满足如下性质 |
|---|---|
isequal(x, y) | x 与 y 数值与类型上是否完全相同 |
isfinite(x) | x 是否是有限大的数字 |
isinf(x) | x 是否是(正/负)无穷大 |
isnan(x) | x 是否是 NaN |
isapprox(x, y) | x 与 y 是否近似相等(运算符 ≈) |
isequal 认为 NaN 之间是相等的,这一点和 == 运算符不同:
实例
julia> isequal(NaN, NaN)
true
julia> NaN == NaN
false
julia> isequal([1 NaN], [1 NaN])
true
julia> [1 NaN] == [1 NaN]
false
true
julia> NaN == NaN
false
julia> isequal([1 NaN], [1 NaN])
true
julia> [1 NaN] == [1 NaN]
false
isequal 也能用来区分带符号的零:
实例
julia> -0.0 == 0.0
true
julia> isequal(-0.0, 0.0)
false
true
julia> isequal(-0.0, 0.0)
false
isapprox 用于浮点数的近似比较,由于浮点误差,直接用 == 比较两个浮点数往往不符合预期:
实例
julia> isfinite(5)
true
julia> isfinite(NaN32)
false
julia> 0.1 + 0.2 == 0.3
false
julia> 0.1 + 0.2 ≈ 0.3
true
true
julia> isfinite(NaN32)
false
julia> 0.1 + 0.2 == 0.3
false
julia> 0.1 + 0.2 ≈ 0.3
true
舍入函数
下表列出了 Julia 支持的舍入函数:
| 函数 | 描述 | 返回类型 |
|---|---|---|
round(x) | x 舍到最接近的整数 | typeof(x) |
round(T, x) | x 舍到最接近的整数 | T |
floor(x) | x 向 -Inf 舍入 | typeof(x) |
floor(T, x) | x 向 -Inf 舍入 | T |
ceil(x) | x 向 +Inf 方向取整 | typeof(x) |
ceil(T, x) | x 向 +Inf 方向取整 | T |
trunc(x) | x 向 0 取整 | typeof(x) |
trunc(T, x) | x 向 0 取整 | T |
实例
julia> round(3.8)
4.0
julia> round(Int, 3.8)
4
julia> floor(3.8)
3.0
julia> floor(Int, 3.8)
3
julia> ceil(3.8)
4.0
julia> ceil(Int, 3.8)
4
julia> trunc(3.8)
3.0
julia> trunc(Int, 3.8)
3
4.0
julia> round(Int, 3.8)
4
julia> floor(3.8)
3.0
julia> floor(Int, 3.8)
3
julia> ceil(3.8)
4.0
julia> ceil(Int, 3.8)
4
julia> trunc(3.8)
3.0
julia> trunc(Int, 3.8)
3
注意:不带类型参数的 floor(3.8) 返回 Float64 类型的 3.0,只有指定类型 floor(Int, 3.8) 才返回整数 3。这与 Python 的 int() 行为不同。
除法函数
下表列出了 Julia 支持的除法函数:
| 函数 | 描述 |
|---|---|
div(x,y), x÷y | 截断除法,商向零取整 |
fld(x,y) | 向下取整除法;商向 -Inf 近似 |
cld(x,y) | 向上取整除法;商向 +Inf 近似 |
rem(x,y) | 取余;满足 x == div(x,y)*y + rem(x,y);符号与 x 一致 |
mod(x,y) | 取模;满足 x == fld(x,y)*y + mod(x,y);符号与 y 一致 |
mod1(x,y) | 偏移 1 的 mod;若 y>0,则返回 r∈(0,y],若 y<0,则 r∈[y,0) 且满足 mod(r, y) == mod(x, y) |
mod2pi(x) | 对 2pi 取模;0 <= mod2pi(x) < 2pi |
divrem(x,y) | 返回 (div(x,y),rem(x,y)) |
fldmod(x,y) | 返回 (fld(x,y),mod(x,y)) |
gcd(x,y...) | x, y,... 的最大公约数 |
lcm(x,y...) | x, y,... 的最小公倍数 |
实例
julia> div(11, 4)
2
julia> div(7, 4)
1
julia> fld(11, 4)
2
julia> fld(-5,3)
-2
julia> fld(7.5,3.3)
2.0
julia> cld(7.5,3.3)
3.0
julia> mod(5, 0:2)
2
julia> mod(3, 0:2)
0
julia> mod(8.9,2)
0.9000000000000004
julia> rem(8,4)
0
julia> rem(9,4)
1
julia> mod2pi(7*pi/5)
4.39822971502571
julia> divrem(8,3)
(2, 2)
julia> fldmod(13,4)
(3, 1)
julia> mod1(5,4)
1
julia> gcd(6,0)
6
julia> lcm(4,6)
12
2
julia> div(7, 4)
1
julia> fld(11, 4)
2
julia> fld(-5,3)
-2
julia> fld(7.5,3.3)
2.0
julia> cld(7.5,3.3)
3.0
julia> mod(5, 0:2)
2
julia> mod(3, 0:2)
0
julia> mod(8.9,2)
0.9000000000000004
julia> rem(8,4)
0
julia> rem(9,4)
1
julia> mod2pi(7*pi/5)
4.39822971502571
julia> divrem(8,3)
(2, 2)
julia> fldmod(13,4)
(3, 1)
julia> mod1(5,4)
1
julia> gcd(6,0)
6
julia> lcm(4,6)
12
符号和绝对值函数
下表列出了 Julia 支持的符号和绝对值函数:
| 函数 | 描述 |
|---|---|
abs(x) | x 的模 |
abs2(x) | x 的模的平方 |
sign(x) | 表示 x 的符号,返回 -1,0,或 +1 |
signbit(x) | 表示符号位是 true 或 false |
copysign(x,y) | 返回一个数,其值等于 x 的模,符号与 y 一致 |
flipsign(x,y) | 返回一个数,其值等于 x 的模,符号与 x*y 一致 |
实例
julia> abs(-7)
7
julia> abs(5+3im)
5.830951894845301
julia> abs2(-7)
49
julia> abs2(5+3im)
34
julia> copysign(5,-10)
-5
julia> copysign(-5,10)
5
julia> sign(5)
1
julia> sign(-5)
-1
julia> signbit(-5)
true
julia> signbit(5)
false
julia> flipsign(5,10)
5
julia> flipsign(5,-10)
-5
7
julia> abs(5+3im)
5.830951894845301
julia> abs2(-7)
49
julia> abs2(5+3im)
34
julia> copysign(5,-10)
-5
julia> copysign(-5,10)
5
julia> sign(5)
1
julia> sign(-5)
-1
julia> signbit(-5)
true
julia> signbit(5)
false
julia> flipsign(5,10)
5
julia> flipsign(5,-10)
-5
幂、对数和根函数
下表列出了 Julia 支持的初等数学函数:
| 函数 | 描述 |
|---|---|
sqrt(x), √x | x 的平方根 |
cbrt(x), ∛x | x 的立方根 |
hypot(x,y) | 当直角边的长度为 x 和 y 时,直角三角形斜边的长度 |
exp(x) | 自然指数函数在 x 处的值 |
expm1(x) | 当 x 接近 0 时的 exp(x)-1 的精确值 |
ldexp(x,n) | x*2^n 的高效算法,n 为整数 |
log(x) | x 的自然对数 |
log(b,x) | 以 b 为底 x 的对数 |
log2(x) | 以 2 为底 x 的对数 |
log10(x) | 以 10 为底 x 的对数 |
log1p(x) | 当 x 接近 0 时的 log(1+x) 的精确值 |
exponent(x) | x 的二进制指数 |
significand(x) | 浮点数 x 的二进制有效数(也就是尾数) |
实例
julia> sqrt(49)
7.0
# 对负实数开方会报错,需要传入复数才能得到复数结果
julia> sqrt(-49)
ERROR: DomainError with -49.0:
sqrt was called with a negative real argument but will only return a complex result if called with a complex argument. Try sqrt(Complex(x)).
Stacktrace:
[...]
julia> sqrt(-49 + 0im)
0.0 + 7.0im
julia> cbrt(8)
2.0
julia> cbrt(-8)
-2.0
julia> hypot(3, 4)
5.0
julia> exp(5.0)
148.4131591025766
julia> expm1(1.0)
1.718281828459045
julia> ldexp(4.0, 2)
16.0
julia> log(4)
1.3862943611198906
julia> log(4,2)
0.5
julia> log2(4)
2.0
julia> log10(4)
0.6020599913279624
julia> log1p(4)
1.6094379124341003
julia> exponent(6.8)
2
julia> significand(15.2)*8
15.2
7.0
# 对负实数开方会报错,需要传入复数才能得到复数结果
julia> sqrt(-49)
ERROR: DomainError with -49.0:
sqrt was called with a negative real argument but will only return a complex result if called with a complex argument. Try sqrt(Complex(x)).
Stacktrace:
[...]
julia> sqrt(-49 + 0im)
0.0 + 7.0im
julia> cbrt(8)
2.0
julia> cbrt(-8)
-2.0
julia> hypot(3, 4)
5.0
julia> exp(5.0)
148.4131591025766
julia> expm1(1.0)
1.718281828459045
julia> ldexp(4.0, 2)
16.0
julia> log(4)
1.3862943611198906
julia> log(4,2)
0.5
julia> log2(4)
2.0
julia> log10(4)
0.6020599913279624
julia> log1p(4)
1.6094379124341003
julia> exponent(6.8)
2
julia> significand(15.2)*8
15.2
注意:expm1 和 log1p 专门用于 x 很接近 0 的场景。此时 exp(x)-1 或 log(1+x) 会因为浮点误差丢失精度,而这两个函数能给出精确结果。
三角和双曲函数
Julia 也提供了所有标准的三角和双曲函数:
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
下图中以弧度为单位的角度对应于单位圆上的一个点,其坐标定义了角度的正弦和余弦。

实例
julia> pi
π = 3.1415926535897...
julia> sin(0)
0.0
julia> sin(pi/6)
0.49999999999999994
julia> sin(pi/4)
0.7071067811865475
julia> cos(0)
1.0
julia> cos(pi/6)
0.8660254037844387
julia> cos(pi/3)
0.5000000000000001
π = 3.1415926535897...
julia> sin(0)
0.0
julia> sin(pi/6)
0.49999999999999994
julia> sin(pi/4)
0.7071067811865475
julia> cos(0)
1.0
julia> cos(pi/6)
0.8660254037844387
julia> cos(pi/3)
0.5000000000000001
以上提供的函数都是单参数函数,不过 atan 也可以接收两个参数来表示传统的 atan2 函数:
atan(y) atan(y, x)
分别计算 y 或 y/x 的反正切。双参数版本能根据 x、y 的符号确定正确的象限:
实例
julia> theta = 3pi/4
2.356194490192345
julia> x, y = (cos(theta), sin(theta))
(-0.7071067811865475, 0.7071067811865476)
julia> atan(y/x)
-0.7853981633974484
julia> atan(y, x)
2.356194490192345
2.356194490192345
julia> x, y = (cos(theta), sin(theta))
(-0.7071067811865475, 0.7071067811865476)
julia> atan(y/x)
-0.7853981633974484
julia> atan(y, x)
2.356194490192345
另外,sinpi(x) 和 cospi(x) 分别用来对 sin(pi*x) 和 cos(pi*x) 进行更精确的计算。
角度制三角函数
上面函数的参数都是弧度制。要计算角度制的三角函数,以 d 做后缀即可,比如 sind(x) 计算 x 度的正弦值:
sind cosd tand cotd secd cscd asind acosd atand acotd asecd acscd
实例
# cos(56) 中 56 是弧度
julia> cos(56)
0.853220107722584
# cosd(56) 中 56 是角度
julia> cosd(56)
0.5591929034707468
julia> sind(90)
1.0
julia> cos(56)
0.853220107722584
# cosd(56) 中 56 是角度
julia> cosd(56)
0.5591929034707468
julia> sind(90)
1.0
