Engee 文档

数学运算和初等函数

Julia为该语言的所有数字基元类型提供了一套完整的基本算术和位运算符,以及一组全面的标准数学函数的高效可移植实现。

算术运算符

所有原始数字类型都支持以下内容https://en.wikipedia.org/wiki/Arithmetic#Arithmetic_operations [算术运算符]。

表达方式 姓名 资料描述

+x

一元加

身份操作

-x

一元减号

显示加性反转中的值

x+y

二进制加

执行加法

x-y

二进制负

执行减法

x*y

乘法运算

执行乘法

x/y

部门

执行分部

'x≠y`

整数除法

x/y四舍五入为整数

'x\y`

用反转划分

相当于’y/x`

'x^y`

指数化

将`x`提升为`y`的幂

x%y

遗骸

相当于’rem(x,y)`

将数字文字直接放在标识符或括号前面,例如`2x`或`2(x+y)`,被认为是乘法,并且比其他二进制操作具有更高的优先级。 有关更多信息:请参阅 数字字面系数

由于Julia提升系统,不同类型参数组合的算术运算可以自动、自然、直观地执行。 有关此系统的详细信息,请参阅 转型及推广#conversion-and-promotion【转型升级】。

您可以在REPL或Julia IDE中使用`\div<tab>`来方便地输入符号。 有关更多信息:请参阅 输入Unicode字符指南部分

以下是一些使用算术运算符的简单示例。

julia> 1 + 2 + 3
6

julia> 1 - 2
-1

julia> 3*2/12
0.5

(按照惯例,比其他附近的运营商更早执行的运营商相隔较短的距离。 例如,写`-x+2’通常意味着首先访问’x`,然后将`2’添加到结果中。)

当在乘法中使用时,值’false’充当_strong zero_。

julia> NaN * false
0.0

julia> false * Inf
0.0

这可以防止`NaN’值以明显为零的量替代。 理由:https://arxiv.org/abs/math/9205211 [Knut(1992)]。

逻辑运算符

对于类型 `Bool'支持以下内容https://en.wikipedia.org/wiki/Boolean_algebra#Operations [逻辑运算符]。

表达方式 姓名

!x

否认

x&&y

使用缩写"和"方案计算

'x |\/y`

使用缩写"或"方案计算

否定将`true’更改为’false',反之亦然。 根据缩写方案的计算操作的解释可在提供的链接中找到。

请注意,'Bool’是一个整数类型,并且还为其定义了所有标准提升规则和数字运算符。

按位运算符

对于所有原始整数类型,支持以下内容https://en.wikipedia.org/wiki/Bitwise_operation#Bitwise_operators [按位运算符]。

表达方式 姓名

'~x`

按位"不"

x&y

按位"和"

'x | y`

按位"或"

'x≠y`

位独占"或"

'x≠y`

按位"而不是"

'x≠y`

按位"或不"

x>>>y

逻辑移位向右

x>>y

算术移位向右

x<<y

逻辑/算术左移

以下是使用按位运算符的一些示例。

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

二进制算术和位赋值运算符的所有版本:

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

赋值运算符复盖左侧变量的值。 结果,能够改变变量的类型。

julia>x=0x01;typeof(x)
UInt8
julia>x*=2#类似于x=x*2 2

julia>打字(x)Int64

带点的矢量运算符

对于像`这样的_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)+',其执行操作 广播。 此操作允许您组合具有标量值的数组,将相同大小的数组彼此组合(逐个元素执行),甚至是不同形状的数组(例如,水平和垂直向量,创建矩阵)。 此外,与所有"点"调用一样,带点的运算符是_connecting_。 例如,当计算表达式'+2时。A.^2。+sin为数组`A。(A)`(或等效表达式`@。 2a^2+sin(A)`带宏 xref:base/arrays.adoc#Base.Broadcast.@__dot__[`@.`])使用数组`A`执行单个循环,其中`+2a^2+sin(a)`为`A`中的每个元素`a’计算'2a^2+sin(a)'。 特别是,嵌套的点调用如`f.(g.(x))`被组合,相邻的二进制运算符如'x。+3 .*x.^2'等效于嵌套点调用'()。(x,()。(3, (^).(x,2)))+'。

此外,带赋值的点运算符,如’a。=b'(或'@。 a=b'),分别分析为’a。=a.+b',其中'。='表示将_分配给一个地方的组合操作(参见 关于带点的语法的文档)。

点语法也适用于用户定义的运算符。 例如,如果您定义'⊗(A,B)=kron(A,B)为Kronecker产品使用方便的中缀语法`A⊗B'('kron'),然后是[A,B]。⊗将计算[A⊗C,B⊗D]'而不需要编写额外的代码。

当点运算符与数字文字组合时,可能会出现歧义。 例如,'1是什么。+x`的意思? 可能是1年。 +x’或'1。+x'。 因此,这种语法是不允许的;在这种情况下,您需要在运算符周围放置空格。

比较数字

标准比较操作是为所有原始数值类型定义的。

操作员 姓名

==

平等

!=,

不平等

<

更少

<=,

小于或等于

>

更多

>=,

大于或等于

这里有一些简单的例子。

julia> 1 == 1
true

julia>1==2
错误

julia>1!= 2
真的

julia>1==1.0
真的

julia>1<2
真的

julia>1.0>3
错误

julia>1>=1.0
真的

julia>-1<=1
真的

julia>-1<=-1
真的

julia>-1<=-2
错误

julia>3<-0.5
错误

整数使用标准位比较进行比较。 浮点数根据比较https://en.wikipedia.org/wiki/IEEE_754-2008 [IEEE754标准]:

  • 最后的数字按通常的方式排序;

  • 正零等于负零,但不大于它;

  • 'Inf’的值等于自身并且大于除’NaN`之外的所有其他值;

  • `-Inf’的值等于自身并且小于除’NaN`之外的所有其他值;

  • 'NaN`的值不等于任何值,不多于或少于任何值,包括该值本身。

最后一点可能是出乎意料的,所以注意以下内容是有意义的。

julia> NaN == NaN
false

julia> NaN != NaN
true

julia> NaN < NaN
false

julia> NaN > NaN
false

在使用时,它也会产生问题 数组

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

Julia中提供了额外的函数来检查数字的特殊值,这可能很有用,例如在比较哈希键时。

功能 什么检查

'等效(x,y)`

'X’和’y’是相同的。

'isfinite(x)`

'x’是一个有限数。

'isinf(x)`

'x’是无限的。

'伊斯南(x)`

'x’不是数字。

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`调用 ==,所以如果你想为自己的类型定义相等,只需为它添加一个方法。 ==. 如果您正在定义自己的相等函数,那么定义适当的方法是有意义的。 `hash'使得’isequal(x,y)`暗示`hash(x)==hash(y)'。

一连串的比较

与大多数语言不同,https://en.wikipedia.org/wiki/Python_syntax_and_semantics#Comparison_operators [除了Python的显着例外],任意比较链在Julia中是可能的。

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

比较链通常便于在数字代码中使用。 他们使用`&&'运算符来比较标量值和运算符 `&'用于逐元素比较,这允许数组在链中使用。 例如,`0。<A.<1’输出一个布尔值数组,当`A`的相应元素在0到1的范围内时,其元素为true。

注意比较链的工作顺序。

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)`计算数组’A’中每个元素的正弦值。

运算符优先级和关联性

Julia语言使用以下运算符的顺序和关联性,从最高优先级到最低优先级。

类别: 营办商 联合性,联合性

语法

.'然后::`

左撇子

指数化

^

正确的

一元

+ - ! ~ ¬ √ ∛ ∜ ⋆ ± ∓ <: >:

右脚注:1[一元运算符'+'和'-'需要在参数周围显式括号,以将这些运算符与`++和其他运算符区分开来。 一元运算符的其他组合用右侧的关联性分析,例如,'√√-a’被认为是'√(√(-a))。]

位移

<< >> >>>

左撇子

分数;分数

//

左撇子

乘法运算

* / % & \ ÷

左脚注:2[运算符``,`pass:c[]`和`+`不是关联的。 表达式'a+b+c`被分析为`+(a,b,c)`,而不是`+(+(a,b),c)'。 但是,备份方法都适用于'(a,b,c,d。..)'和'(a,b,c,d。..默认情况下,+`是用左手结合性计算的。]

此外

+ - | ⊻

左脚注:2[]

语法

: ..

左撇子

语法

|>

左撇子

语法

<|

正确的

比较

> < >= <= == === != !== <:

没有关联性

执行的顺序

'&&`,然后`\/’然后'?`

正确的

夫妇

=>

正确的一个

指派任务

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

正确的一个

有关每个Julia运算符的优先级的完整列表,请参阅文件顶部:https://github.com/JuliaLang/julia/blob/master/src/julia-parser.scm ['src/julia-解析器。scm']。 请注意,其中一些运算符没有在`Base`模块中定义,但可能在标准库,包或用户代码中有定义。

您还可以使用内置函数`Base找出任何运算符的数值优先级值。operator_precedence`(数字越高,优先级越高)。

julia> Base.operator_precedence(:+), Base.operator_precedence(:*), Base.operator_precedence(:.)
(11, 12, 17)

julia> Base.operator_precedence(:sin), Base.operator_precedence(:+=), Base.operator_precedence(:(=))  # (Скобки в `:(=)` обязательны.)
(0, 1, 1)

也可以通过调用内置函数`Base来获得运算符关联性的符号表示。operator_associativity'。

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)

请注意,:sin`等字符返回`0’的优先级。 此值表示无效运算符,而不是具有最低优先级的运算符。 类似地,这样的运算符被分配了关联性:none'。

数字字面系数,如`2x',被视为在任何其他二进制操作之前执行的乘法。 例外是指数运算('^'`,其中只有在指数中才会首先执行乘法。

julia> x = 3; 2x^2
18

julia> x = 3; 2^2x
64

它们的组合将被分析为在指数化过程中具有标准不对称性的一元运算符:表达式`-x^y2x^y分别被分析为-(x^y)2(x^y),而x^-yx^2y被分析为+

数字类型转换

Julia支持三个数字类型转换选项,它们在处理不准确转换的方式上有所不同。

  • 编写’T(x)`或`convert(T,x)`将`x`转换为`T’类型的值。 如果’T’是浮点类型,则结果将是它表示的最接近的值,可以是正无穷大或负无穷大。 如果类型’T’是整数,并且值’x’不能用类型`T’表示,则返回错误`InexactError'。

  • 'x%T`将整数’x’转换为整数类型值’T`,与`x`除以`2^n`的整数除法结果相当,其中`n`是`T’中的位数。 换句话说,二进制表示被截断以匹配类型。

  • 舍入函数将类型`T`作为可选参数。 例如,'round(Int,x)是`Int(round(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

julia> round(Int8,127.6)
ERROR: InexactError: Int8(128.0)
Stacktrace:
[...]

在该部分 转换和促销描述了如何定义自己的转换和促销。

舍入函数

功能 资料描述 返回值的类型

'圆(x)`

将`x’舍入到最接近的整数

'类型(x)`

'圆(T,x)`

将`x’舍入到最接近的整数

'T`

'楼层(x)`

在`-Inf`方向上舍入`x`

'类型(x)`

'楼层(T,x)`

在`-Inf`方向上舍入`x`

'T`

'ceil(x)`

在`+Inf`的方向上舍入`x`

'类型(x)`

'ceil(T,x)`

在`+Inf`的方向上舍入`x`

'T`

'trunc(x)`

将`x`向零旋转

'类型(x)`

'trunc(T,x)`

将`x`向零旋转

'T`

部门职能

功能 资料描述

'div(x,y)','x≠y`

用截断除法;商四舍五入"为零"

'fld(x,y)`

除法向下舍入;商向`-Inf`舍入

'cld(x,y)`

向上四舍五入除法;商向`+Inf`四舍五入

'rem(x,y)','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’

'mod’与偏移量1;返回`r∈(0,y]为`y>0`或`r∈[y,0)`为`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,的正最小公倍数。..

符号和绝对值函数

功能 资料描述

'abs(x)`

取模`x`的正值

'abs2(x)`

模块’x’平方

'符号(x)`

显示"x"符号,返回—​1、0或+1

'符号(x)`

指示符号位是启用(true)还是禁用(false)

'copysign(x,y)`

取模’x’的值,符号为’y`

'flipsign(x,y)`

取模’x’的值,符号为’x*y`

度、对数和根

功能 资料描述

sqrt(x),'√x`

`X`的平方根

'cbrt(x)','∛x`

`X`的立方根

'hypot(x,y)`

直角三角形的斜边,长度为"x"和"y`

'exp(x)`

具有指数`x`的指数函数

'expm1(x)'

精确计算`x`接近零的`exp(x)-1`

'ldexp(x,n)`

有效计算`n`整数值的`x*2^n'

'日志(x)`

'X’的自然对数。

'日志(b,x)`

基于`b`的`x`的对数

'log2(x)`

以2为底的’x’的对数

'log10(x)`

以10为底的’x’的对数

'log1p(x)`

精确计算`log(1+x)`的`x’接近零

'指数(x)`

`X`的二元指数

'意义(x)`

浮点数’x`的二进制有效部分(尾数)

等功能的必要性和有用性 'hypot', 'expm1'`log1p',在John D.Cook的博客上的两篇优秀文章中描述:https://www.johndcook.com/blog/2010/06/07/math-library-functions-that-seem-unnecessary /[expm1,log1p,erfc]和https://www.johndcook.com/blog/2010/06/02/whats-so-hard-about-finding-a-hypotenuse /[hypot]。

三角函数和双曲函数

还定义了所有标准三角函数和双曲函数。

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

它们都是单个参数的函数,并且 'atan'也可以取两个参数,对应传统函数https://en.wikipedia.org/wiki/Atan2 ['atan2']。

此外,功能可用 'sinpi(x)'`cospi(x)'分别进行更精确的计算 'sin(pi*x’'cos(pi*x)'

要使用度(而不是弧度)计算三角函数,请在函数名称中添加结尾`d`。 例如, `sind(x)'计算`x’的正弦,其中’x’的值以度给出。 度的三角函数选项的完整列表:

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

特殊功能

包裹https://github.com/JuliaMath/SpecialFunctions.jl [特殊功能。jl]包含许多额外的特殊数学函数。