前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Julia(数学运算和基本函数)

Julia(数学运算和基本函数)

作者头像
云深无际
发布2021-04-14 14:18:46
1.7K0
发布2021-04-14 14:18:46
举报
文章被收录于专栏:云深之无迹云深之无迹

数学运算和基本函数

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反之亦然

朱莉娅的晋升系统自然而自动地对参数类型混合的算术运算“起作用”。有关升级系统的详细信息,请参见转换和升级。

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

代码语言:javascript
复制
julia> 1 + 2 + 3
6

julia> 1 - 2
-1

julia> 3*2/12
0.5

(按照惯例,如果将运算符应用在附近的其他运算符之前,我们倾向于将其紧缩。例如,我们通常会写成-x + 2反映出首先x取反,然后2再添加到该结果中。)

按位运算符

所有原始整数类型均支持以下按位运算符:

代码语言:javascript
复制
按位不

以下是一些按位运算符的示例:

代码语言:javascript
复制
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

代码语言:javascript
复制
julia> x = 1
1

julia> x += 3
4

julia> x
4

所有二进制算术和按位运算符的更新版本为:

代码语言:javascript
复制
+=  -=  *=  /=  \=  ÷=  %=  ^=  &=  |=  ⊻=  >>>=  >>=  <<=

注意

更新操作符将在左侧重新绑定变量。结果,变量的类型可能会改变。

代码语言:javascript
复制
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]。类似地,对于像!或的一元运算符,也有一个相应.√的元素将其按元素应用。

代码语言:javascript
复制
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]

数值比较

为所有原始数字类型定义了标准比较操作:

代码语言:javascript
复制
平等

以下是一些简单的示例:

代码语言:javascript
复制
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 不等于,不小于且不大于任何事物,包括自身。

最后一点可能令人惊讶,因此值得注意:

代码语言:javascript
复制
julia> NaN == NaN
false

julia> NaN != NaN
true

julia> NaN < NaN
false

julia> NaN > NaN
false

并可能导致Arrays特别头痛:

代码语言:javascript
复制
julia> [1 NaN] == [1 NaN]
false

Julia提供了一些附加功能来测试数字的特殊值,这在诸如哈希键比较之类的情况下非常有用:

代码语言:javascript
复制
x并且y是相同的

isequal()认为NaN彼此相等:

代码语言:javascript
复制
julia> isequal(NaN, NaN)
true

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

julia> isequal(NaN, NaN32)
true

isequal() 也可以用来区分带符号的零:

代码语言:javascript
复制
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以外,比较可以任意链接:

代码语言:javascript
复制
julia> 1 < 2 <= 2 < 3 == 3 > 2 >= 1 == 1 < 3 != 5
true

在数字代码中,链接比较通常非常方便。链式比较将&&运算符用于标量比较,将&运算符用于元素比较,这使它们可以处理数组。例如,0 .< A .< 1给出一个布尔数组,其条目为true,其中的对应元素A在0和1之间。

注意链式比较的评估行为:

代码语言:javascript
复制
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从最高优先级到最低优先级应用以下操作顺序:

代码语言:javascript
复制
.
 其次是 
::

有关每个 Julia运算符优先级的完整列表,请参见此文件的顶部:src/julia-parser.scm

您还可以通过内置函数查找任何给定运算符的数字优先级Base.operator_precedence,其中较高的数字优先。

代码语言:javascript
复制
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))

以下示例显示了不同的形式。

代码语言:javascript
复制
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

代码语言:javascript
复制
truncated division; quotient rounded towards zero

符号和绝对值功能

代码语言:javascript
复制
一个正值,其大小为 x

Powers, logs and roots

代码语言:javascript
复制
square root of x

三角函数和双曲函数

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

代码语言:javascript
复制
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轴和由其参数指定的点之间的弧度角表示弧度,并解释为xy坐标。

此外,sinpi(x)cospi(x)提供了用于更准确的计算sin(pi*x)cos(pi*x)分别。

为了使用度数而不是弧度来计算三角函数,请在函数后缀d。例如,sind(x)计算以度为单位指定xwhere 的正弦x。具有度数变体的三角函数的完整列表为:

代码语言:javascript
复制
sind   cosd   tand   cotd   secd   cscd
asind  acosd  atand  acotd  asecd  acscd

Special functions

代码语言:javascript
复制
gamma function at x
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云深之无迹 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数学运算和基本函数
    • 算术运算符
      • 按位运算符
        • 更新运算符
          • 向量化的“点”运算符
            • 数值比较
              • 链接比较
              • 基本功能
            • 运算符优先级
              • 数值转换
                • 符号和绝对值功能
                • Powers, logs and roots
                • 三角函数和双曲函数
                • Special functions
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档