数学运算和初等函数
Julia在其所有数值基元类型中提供了基本算术和按位运算符的完整集合,并提供了标准数学函数的全面集合的可移植、高效的实现。
算术运算符
以下内容https://en.wikipedia.org/wiki/Arithmetic#Arithmetic_operations所有基本数值类型都支持[算术运算符]:
| 表达方式 | 姓名 | 资料描述 |
|---|---|---|
|
一元加 |
身份操作 |
|
一元减 |
将值映射到它们的加性反转 |
|
二进制加 |
执行加法 |
|
二进制减 |
执行减法 |
|
时代 |
执行乘法 |
|
分,分 |
执行分部 |
|
整数除法 |
x/y,截断为整数 |
|
逆除法 |
相当于 |
|
权力 |
加薪 |
|
余数 |
相当于 |
直接放在标识符或括号前的数字文字,例如 2x 或 2(x+y),被视为乘法,除了优先级高于其他二进制运算。 见 数字文字系数的详细信息。
Julia的提升系统使参数类型的混合物的算术运算"只是工作"自然和自动。 见 转换及推广有关推广制度的详情。
÷符号可以通过书写方便地键入 \div<tab> 到REPL或Julia IDE。 查看 关于Unicode输入的手册部分以获取更多信息。
以下是一些使用算术运算符的简单示例:
julia> 1 + 2 + 3
6
julia> 1 - 2
-1
julia> 3*2/12
0.5
(按照惯例,如果他们在附近的其他运营商之前申请,我们倾向于更紧密地对待太空运营商。 例如,我们通常会写 -x+2 首先反映这一点 x 被否定,然后 2 被添加到该结果中。)
在乘法中使用时, 错误 充当_strong zero_:
julia> NaN * false
0.0
julia> false * Inf
0.0
这对于防止 南 已知为零的数量中的值。 见https://arxiv.org/abs/math/9205211[Knuth(1992)]为动机。
按位运算符
以下内容https://en.wikipedia.org/wiki/Bitwise_operation#Bitwise_operators所有原始整数类型都支持[按位运算符]:
| 表达方式 | 姓名 |
|---|---|
|
按位不 |
|
按位和 |
|
按位或 |
|
按位异或(独占或) |
|
按位nand(不是和) |
|
按位nor(not or) |
|
逻辑移位右 |
|
算术移位右 |
|
逻辑/算术左移 |
以下是一些按位运算符的示例:
julia> ~123
-124
julia> 123 & 234
106
julia> 123 | 234
251
julia> 123 ⊻ 234
145
julia> xor(123, 234)
145
julia> nand(123, 123)
-124
julia> 123 ⊼ 123
-124
julia> nor(123, 124)
-128
julia> 123 ⊽ 124
-128
julia> ~UInt32(123)
0xffffff84
julia> ~UInt8(123)
0x84
更新运算符
每个二进制算术和按位运算符也有一个更新版本,将运算结果分配回其左操作数。 二进制运算符的更新版本是通过放置一个 = 紧接着操作员。 例如,写作 x+=3 相当于写作 x=x+3:
julia> x = 1
1
julia> x += 3
4
julia> x
4
所有二进制算术和按位运算符的更新版本是:
+= -= *= /= \= ÷= %= ^= &= |= ⊻= >>>= >>= <<=
|
注意更新运算符在左侧重新绑定变量。 因此,变量的类型可能会发生变化。
|
矢量化"点"运算符
对于_every_二进制操作像 ^,有相应的"点"操作 .^ 即_automatically_定义为执行 ^ 数组上的逐个元素。 例如, [1, 2, 3] ^ 3 没有定义,因为没有标准的数学意义来"立方体化"一个(非正方形)数组,但是 [1, 2, 3] .^ 3 被定义为计算元素化(或"矢量化")结果 [1^3, 2^3, 3^3]. 同样,对于一元运算符,如 ! 或 √,有相应的 .√ 这适用于运算符elementwise。
julia> [1, 2, 3] .^ 3
3-element Vector{Int64}:
1
8
27
更具体地说, a.^b 被解析为 "点"呼叫 (^).(a,b),其执行一 广播操作:它可以组合数组和标量,相同大小的数组(执行操作elementwise),甚至不同形状的数组(例如组合行和列向量以产生矩阵)。 而且,像所有矢量化的"点调用"一样,这些"点运算符"是_fusing_。 例如,如果计算 2 .*A.^2。+罪。(A) (或等同地 @. 2a^2+罪(A),使用 @.宏)为数组 A,它执行_single_循环 A、计算 2a^2+sin(a) 对于每个元素 a 的 A. 特别是,嵌套的点调用,如 f.(g.(x)) 是融合的,和"相邻"二元运算符,如 x.+ 3 .*x.^2 等效于嵌套的点调用 (+).(x,(*)。(3, (^).(x,2))).
此外,"点状"更新运营商喜欢 a.+=b (或 @. a+=b)被解析为 a.=a.+b,在哪里 .= 是一个融合_in-place_赋值操作(见 dot语法文档)。
注意点语法也适用于用户定义的运算符。 例如,如果定义 ⊗(A,B)=kron(A,B) 给出一个方便的中缀语法 A>B 对于Kronecker产品(克伦),则 [A,B]。⊗[C,D] 将计算 [A∈C,B∈D] 没有额外的编码。
将点运算符与数字文字组合可能是不明确的。 例如,目前尚不清楚是否 1.+x 手段 1. +x 或 1 .+x. 因此,这种语法是不允许的,在这种情况下,必须在运算符周围使用空格。
数字比较
标准比较操作是为所有基本数值类型定义的:
| 操作员 | 姓名 |
|---|---|
平等 |
|
不平等 |
|
小于 |
|
小于或等于 |
|
大于 |
|
大于或等于 |
以下是一些简单的例子:
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
朱莉娅>-1<=-1
真的
朱莉娅>-1<=-2
错误
朱莉娅>3<-0.5
错误
整数以标准方式进行比较-通过位的比较。 浮点数根据比较https://en.wikipedia.org/wiki/IEEE_754-2008[IEEE754标准]:
*有限数字以通常的方式排序。
*正零等于但不大于负零。
* 资讯 等于自己,大于其他一切,除了 南.
* -Inf 等于自己,比其他一切都少,除了 南.
* 南 不等于,不小于,也不大于任何东西,包括它本身。
最后一点可能令人惊讶,因此值得注意:
julia> NaN == NaN
false
julia> NaN != NaN
true
julia> NaN < NaN
false
julia> NaN > NaN
false
并且在工作时会引起头痛 数组:
julia> [1 NaN] == [1 NaN]
false
Julia提供了额外的函数来测试特殊值的数字,这在哈希键比较等情况下很有用:
| 功能 | 测试如果 |
|---|---|
|
|
|
|
|
|
|
等效;等效考虑 南s彼此相等:
julia> isequal(NaN, NaN)
true
julia> isequal([1 NaN], [1 NaN])
true
julia> isequal(NaN, NaN32)
true
等效;等效 也可用于区分带符号的零:
julia> -0.0 == 0.0
true
julia> isequal(-0.0, 0.0)
false
有符号整数、无符号整数和浮点数之间的混合类型比较可能很棘手。 为了确保茱莉亚正确地做到这一点,我们采取了很多措施.
对于其他类型, 等效;等效 默认调用 ==,所以如果你想为自己的类型定义相等,那么你只需要添加一个 ==方法。 如果你定义了自己的相等函数,你可能应该定义一个对应的 哈希方法,以确保 等距(x,y) 暗示 哈希(x)==哈希(y).
链接比较
与大多数语言不同,https://en.wikipedia.org/wiki/Python_syntax_and_semantics#Comparison_operators[Python的显着例外],比较可以任意链接:
julia> 1 < 2 <= 2 < 3 == 3 > 2 >= 1 == 1 < 3 != 5
true
在数字代码中,链接比较通常非常方便。 链接比较使用 && 标量比较运算符,以及 &elementwise比较的运算符,它允许它们处理数组。 例如, 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),例如 罪。(一) 将计算数组中每个元素的正弦 A.
运算符优先级和关联性
Julia应用以下操作的顺序和关联性,从最高优先级到最低优先级:
| 类别: | 营办商 | 联合性,联合性 |
|---|---|---|
语法 |
|
左图 |
指数化 |
|
对 |
一元 |
|
右脚注:1[一元运算符 |
比特转移 |
|
左图 |
分数;分数 |
|
左图 |
乘法运算 |
|
左脚注:2[运算符 |
此外 |
|
左脚注:2[] |
语法 |
|
左图 |
语法 |
|
左图 |
语法 |
|
对 |
比较 |
|
非关联性 |
控制流程 |
|
对 |
对 |
|
对 |
分配作业 |
|
对 |
有关_every_Julia运算符优先级的完整列表,请参阅此文件的顶部:https://github.com/JuliaLang/julia/blob/master/src/julia-parser.scm[脧锚脧赂`src/julia-解析器。供应链管理`]. 请注意,有些运算符没有在 基地 模块,但可以由标准库,包或用户代码给出定义。
您还可以通过内置函数找到任何给定运算符的数字优先级 基地。操作符_记录符,其中较高的数字优先:
julia> Base.operator_precedence(:+), Base.operator_precedence(:*), Base.operator_precedence(:.)
(11, 12, 17)
julia> Base.operator_precedence(:sin), Base.operator_precedence(:+=), Base.operator_precedence(:(=)) # (Note the necessary parens on `:(=)`)
(0, 1, 1)
也可以通过调用内置函数找到表示运算符关联性的符号 基地。操作性_社会性:
julia> Base.operator_associativity(:-), Base.operator_associativity(:+), Base.operator_associativity(:^)
(:left, :none, :right)
julia> Base.operator_associativity(:⊗), Base.operator_associativity(:sin), Base.operator_associativity(:→)
(:left, :none, :right)
请注意,符号如 :罪 返回优先级 0. 此值表示无效运算符,而不是最低优先级的运算符。 类似地,这样的运算符被分配了关联性 :无.
数字文字系数,例如 2x,被视为优先于任何其他二进制操作的乘法,但 ^ 它们仅作为指数具有更高的优先级。
julia> x = 3; 2x^2
18
julia> x = 3; 2^2x
64
并列解析就像一元运算符,它在指数周围具有相同的自然不对称性: -x^y 和 2x^y 解析为 -(x^y) 和 2(x^y) 鉴于 x^-y 和 x^2y 解析为 x^(-y) 和 x^(2y).
数值转换
Julia支持三种形式的数值转换,它们在处理不精确转换方面有所不同。
*符号 T(x) 或 转换(T,x) 皈依者 x 到类型的值 T.
**如果 T 是浮点类型,结果是最近的可表示值,可以是正无穷大或负无穷大。
**如果 T 是整数类型, N.恐怖,恐怖 如果 x 不能由 T.
* x%T 转换整数 x 到整数类型的值 T 全等到 x 模数,模数 2^n,在哪里 n 是位数在 T. 换句话说,二进制表示被截断以适合。
* 舍入函数取一个类型 T 作为可选参数。 例如, 圆(Int,x) 是一个简写 Int(圆(x)).
下面的例子显示了不同的形式。
julia> Int8(127)
127
julia> Int8(128)
ERROR: InexactError: trunc(Int8, 128)
Stacktrace:
[...]
julia> Int8(127.0)
127
julia> Int8(3.14)
ERROR: InexactError: Int8(3.14)
Stacktrace:
[...]
julia> Int8(128.0)
ERROR: InexactError: Int8(128.0)
Stacktrace:
[...]
julia> 127 % Int8
127
julia> 128 % Int8
-128
julia> round(Int8,127.4)
127
朱莉娅>圆(Int8,127.6)
错误:InexactError:Int8(128.0)
[医]堆垛机:
[...]
见 转换和促销如何定义自己的转换和促销。
舍入函数
| 功能 | 资料描述 | 返回类型 |
|---|---|---|
圆形 |
|
|
圆形 |
|
|
圆形 |
|
|
圆形 |
|
|
圆形 |
|
|
圆形 |
|
|
圆形 |
|
|
圆形 |
|
部门职能
| 功能 | 资料描述 |
|---|---|
|
截断除法;商四舍五入为零 |
floored division;商四舍五入 |
|
天花板划分;商四舍五入 |
|
|
余数;满足 |
模量;满足 |
|
|
|
相对于2pi的模量; |
|
申报表 |
|
申报表 |
|
的最大公约数 |
|
的最小正公倍数 |
符号和绝对值函数
| 功能 | 资料描述 |
|---|---|
一个正值,其大小为 |
|
的平方幅度 |
|
表示的标志 |
|
指示符号位是on(true)还是off(false) |
|
大小为 |
|
大小为 |
权力,日志和根
| 功能 | 资料描述 |
|---|---|
|
的平方根 |
|
多维数据集根 |
|
第四根 |
与其他边长的直角三角形的斜边 |
|
自然指数函数在 |
|
准确无误 |
|
|
|
的自然对数 |
|
基地 |
|
以2为底的对数 |
|
以10为底的对数 |
|
准确无误 |
|
的二进制指数 |
|
浮点数的二进制有效值(a.k.a.尾数) |
三角函数和双曲函数
还定义了所有标准的三角函数和双曲函数:
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
这些都是单参数函数,具有 阿坦也接受与传统相对应的两个参数https://en.wikipedia.org/wiki/Atan2[脧锚脧赂`阿坦2`]功能。
此外, 辛皮(x)和 cospi(x)提供了更准确的计算 罪(pi*x)和 cos(pi*x)分别。
为了用度而不是弧度来计算三角函数,用 d. 例如, 信德(x)计算的正弦 x 哪里 x 以度为单位指定。 度变体的三角函数的完整列表是:
sind cosd tand cotd secd cscd asind acosd atand acotd asecd acscd