Julia提供了所有其数字原始类型的基本算术运算符和按位运算符的完整集合,并提供了标准数学函数的全面集合的可移植且有效的实现。
所有原始数字类型均支持以下算术运算符:
表达 | 名称 | 描述 |
---|---|---|
+x | 一元加 | 身份操作 |
-x | 一元减 | 将值映射到它们的加法逆 |
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> 1 + 2 + 3
6
julia> 1 - 2
-1
julia> 3*2/12
0.5
(按照惯例,如果将运算符应用在附近的其他运算符之前,我们倾向于将其紧缩。例如,我们通常会写成-x + 2
反映出首先x
取反,然后2
再添加到该结果中。)
所有原始整数类型均支持以下按位运算符:
按位不
以下是一些按位运算符的示例:
julia> ~123
-124
julia> 123 & 234
106
julia> 123 | 234
251
julia> 123 ⊻ 234
145
julia> xor(123, 234)
145
julia> ~UInt32(123)
0xffffff84
julia> ~UInt8(123)
0x84
每个二进制算术和按位运算符还具有一个更新版本,该版本将运算结果分配回其左操作数。二进制运算符的更新版本是通过=
在运算符后立即放置一个形式来形成的。例如,写作x += 3
等同于写作x = x + 3
:
julia> x = 1
1
julia> x += 3
4
julia> x
4
所有二进制算术和按位运算符的更新版本为:
+= -= *= /= \= ÷= %= ^= &= |= ⊻= >>>= >>= <<=
注意
更新操作符将在左侧重新绑定变量。结果,变量的类型可能会改变。
julia> x = 0x01; typeof(x)
UInt8
julia> x *= 2 # Same as x = x * 2
2
julia> typeof(x)
Int64
对于每个类似的二进制操作^
,都有一个相应的“点”操作.^
被自动定义为^
对数组执行逐个元素的操作。例如,[1,2,3] ^ 3
未定义,因为没有标准的数学意义来“ [1,2,3] .^ 3
立方化” 数组,而是定义为计算元素(或“向量化”)结果[1^3, 2^3, 3^3]
。类似地,对于像!
或的一元运算符√
,也有一个相应.√
的元素将其按元素应用。
julia> [1,2,3] .^ 3
3-element Array{Int64,1}:
1
8
27
更具体地说,a .^ b
将其解析为“点”调用 (^).(a,b)
,该调用执行广播操作:它可以组合数组和标量,相同大小的数组(逐个执行操作),甚至不同形状的数组(例如,组合行向量和列向量)产生矩阵)。而且,像所有向量化的“点调用”一样,这些“点运算符”也在融合。例如,如果你计算2 .* A.^2 .+ sin.(A)
(或等效@. 2A^2 + sin(A)
,使用@.
宏)用于阵列A
,它执行一个单一的过循环A
,计算2a^2 + sin(a)
对中的每个元素A
。特别是,嵌套点调用(例如)f.(g.(x))
是融合的,“相邻”二进制运算符(例如)是融合的x .+ 3 .* x.^2
等价于嵌套点调用(+).(x, (*).(3, (^).(x, 2)))
。
此外,像a .+= b
(或@. a += b
)这样的“点状”更新运算符被解析为a .= a .+ b
,其中.=
是融合的就地分配操作。
请注意,点语法也适用于用户定义的运算符。例如,如果您定义为Kronecker产品()⊗(A,B) = kron(A,B)
提供方便的中缀语法,则无需额外编码即可进行计算。A ⊗ Bkron[A,B] .⊗ [C,D][A⊗C, B⊗D]
为所有原始数字类型定义了标准比较操作:
平等
以下是一些简单的示例:
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
以标准方式比较整数-通过比较位。浮点数根据IEEE 754标准进行比较:
Inf
等于自身,大于除NaN
。-Inf
等于自身,等于小于其他一切NaN
。NaN
不等于,不小于且不大于任何事物,包括自身。最后一点可能令人惊讶,因此值得注意:
julia> NaN == NaN
false
julia> NaN != NaN
true
julia> NaN < NaN
false
julia> NaN > NaN
false
并可能导致Arrays特别头痛:
julia> [1 NaN] == [1 NaN]
false
Julia提供了一些附加功能来测试数字的特殊值,这在诸如哈希键比较之类的情况下非常有用:
x并且y是相同的
isequal()
认为NaN
彼此相等:
julia> isequal(NaN, NaN)
true
julia> isequal([1 NaN], [1 NaN])
true
julia> isequal(NaN, NaN32)
true
isequal()
也可以用来区分带符号的零:
julia> -0.0 == 0.0
true
julia> isequal(-0.0, 0.0)
false
有符号整数,无符号整数和浮点数之间的混合类型比较可能很棘手。为了确保Julia正确地执行操作,已经采取了很多注意措施。
对于其他类型,isequal()
默认为call ==()
,因此,如果要为自己的类型定义相等性,则只需添加一个==()
方法。如果定义自己的相等函数,则可能应定义一个相应的hash()
方法以确保isequal(x,y)
暗含hash(x) == hash(y)
。
与大多数语言不同,除了Python以外,比较可以任意链接:
julia> 1 < 2 <= 2 < 3 == 3 > 2 >= 1 == 1 < 3 != 5
true
在数字代码中,链接比较通常非常方便。链式比较将&&
运算符用于标量比较,将&
运算符用于元素比较,这使它们可以处理数组。例如,0 .< A .< 1
给出一个布尔数组,其条目为true,其中的对应元素A
在0和1之间。
注意链式比较的评估行为:
julia> v(x) = (println(x); x)
v (generic function with 1 method)
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)
。但是,链式比较中的评估顺序不确定。强烈建议在链式比较中不要使用具有副作用(例如打印)的表达式。如果需要副作用,&&
则应明确使用短路操作器
Julia提供了一系列数学函数和运算符。只要允许合理的定义,就可以对这些数学运算进行广泛的数值定义,包括整数,浮点数,有理数和复数。
而且,这些函数(像任何Julia函数一样)可以通过点语法 以“矢量化”方式应用于数组和其他集合f.(A)
,例如sin.(A)
将计算数组中每个元素的正弦值A
。
Julia从最高优先级到最低优先级应用以下操作顺序:
.
其次是
::
有关每个 Julia运算符优先级的完整列表,请参见此文件的顶部:src/julia-parser.scm
您还可以通过内置函数查找任何给定运算符的数字优先级Base.operator_precedence
,其中较高的数字优先。
julia> Base.operator_precedence(:+), Base.operator_precedence(:*), Base.operator_precedence(:.)
(9, 11, 15)
julia> Base.operator_precedence(:+=), Base.operator_precedence(:(=)) # (Note the necessary parens on `:(=)`)
(1, 1)
Julia支持三种形式的数值转换,它们对不精确转换的处理方式有所不同。
T(x)
或convert(T,x)
转换x
为type的值T
。T
为浮点类型,则结果为最接近的可表示值,可以是正无穷大或负无穷大。T
是整数类型,InexactError
则将引发if x
不能用表示T
。x % T
将整数转换为与modulo相等x
的整数类型的值,其中是中的位数。换句话说,二进制表示被截断以适合。Tx2^nnT
T
作为可选参数。例如,round(Int,x)
是的简写Int(round(x))
。以下示例显示了不同的形式。
julia> Int8(127)
127
julia> Int8(128)
ERROR: InexactError()
Stacktrace:
[1] Int8(::Int64) at ./sysimg.jl:24
julia> Int8(127.0)
127
julia> Int8(3.14)
ERROR: InexactError()
Stacktrace:
[1] convert(::Type{Int8}, ::Float64) at ./float.jl:658
[2] Int8(::Float64) at ./sysimg.jl:24
julia> Int8(128.0)
ERROR: InexactError()
Stacktrace:
[1] convert(::Type{Int8}, ::Float64) at ./float.jl:658
[2] Int8(::Float64) at ./sysimg.jl:24
julia> 127 % Int8
127
julia> 128 % Int8
-128
julia> round(Int8,127.4)
127
julia> round(Int8,127.6)
ERROR: InexactError()
Stacktrace:
[1] trunc(::Type{Int8}, ::Float64) at ./float.jl:651
[2] round(::Type{Int8}, ::Float64) at ./float.jl:337
见推广转化为如何定义自己的转换和促销活动。
Function | Description | Return type |
---|---|---|
round(x) | round x to the nearest integer | typeof(x) |
round(T, x) | round x to the nearest integer | T |
floor(x) | round x towards -Inf | typeof(x) |
floor(T, x) | round x towards -Inf | T |
ceil(x) | round x towards +Inf | typeof(x) |
ceil(T, x) | round x towards +Inf | T |
trunc(x) | round x towards zero | typeof(x) |
trunc(T, x) | round x towards zero | T |
Division functions
truncated division; quotient rounded towards zero
一个正值,其大小为 x
square root of x
还定义了所有标准三角函数和双曲函数:
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除外,它以x轴和由其参数指定的点之间的弧度角表示弧度,并解释为x和y坐标。
此外,sinpi(x)
并cospi(x)
提供了用于更准确的计算sin(pi*x)
和cos(pi*x)
分别。
为了使用度数而不是弧度来计算三角函数,请在函数后缀d
。例如,sind(x)
计算以度为单位指定x
where 的正弦x
。具有度数变体的三角函数的完整列表为:
sind cosd tand cotd secd cscd
asind acosd atand acotd asecd acscd
gamma function at x