Julia机器学习核心编程:人人可用的高性能科学计算
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.5 Julia中的算术和逻辑运算

本节介绍Julia中的算术和逻辑运算,这与其他编程语言类似。

2.5.1 执行算术运算

在Julia中执行算术运算十分简单。Julia提供了一整套运算符,比如最常用的二元运算符:+、−、*、/、^和%。

【范例2-21】算术运算

01  julia> a = 10; b = 20; a + b
02  30

代码01行定义了两个变量a和b,它们的值分别为10和20,然后进行a+b运算,结果为30。

如下代码使用一元运算符来反转数字。

01  julia> -4
02  -4
03  julia> -(-4)
04  4

有一个特殊的操作成员“!”,它可以与布尔类型(Bool)一起使用,用于执行否定操作。

01  julia> !(4>2)
02  false

在代码01行中,4>2的结果为true,通过“!”运算符将输出false。

2.5.2 执行按位运算

如表2-3所示为一些不常用的运算符,用于执行按位运算。

表2-3 不常用的运算符

下面举例说明。

【范例2-22】执行按位运算

01  julia> 100 | 200
02  236
03  julia> ~100
04  -101

在代码01行中,对100和200执行按位或运算,结果为236。代码03行将100按位取反,结果为−101。

2.5.3 自更新运算符

Julia也提供了一些自更新运算符,包括:+=、−=、*=、/=。

【范例2-23】自更新运算符

01  julia> x = 4; x += 10   #自增运算
02  14
03  julia> x = 4; x/=2    #自除运算
04  2.0

代码01行定义了一个变量x,其值为4,并通过“+=”自增运算符,x自增10,结果为14。代码03行的操作方法与01行类似。

在范例2-23中,x的类型从Int变为Float,是因为自更新运算符将值提升为左侧的变量类型。

Julia还提供了一些比较运算符,如==、!=、<、<=、>、>=等。

【范例2-24】比较运算符的使用

01  julia> 100 > 99.9
02  true
03  julia> 24 == 24.0
04  true
05  julia> 24 === 24.0
06  false
07  julia> 24 !== 24.0
08  true

在代码01行中,100>99.9,返回true。后面的代码与01行类似。代码05行中的“===”表示强相等,要求不仅值相等,其类型也需要相同。虽然24与24.0值相等,但是它们的类型不同,所以返回false。

NaN不等于任何值,甚至不等于其本身。

01  julia> NaN == NaN
02  false
03  julia> NaN === NaN
04  true
05  julia> Inf == Inf
06  true
07  julia> Inf >= NaN
08  false

在代码01行中,NaN与NaN比较结果为false。代码05行中的Inf表示最大值,值相等及类型相同,所以返回true。代码07行Inf与NaN比较结果为false,因为NaN不与任何值相等,包括它自己。

2.5.4 运算符的优先级

Julia的运算符有优先级,它们从高到低的顺序如表2-4所示。

表2-4 运算符的优先级

2.5.5 类型转换(数字)

类型转换是指更改变量的类型,但保持变量的值不变。

【范例2-25】类型转换

01  julia> Int8(100)    #创建一个字长为8位的值
02  100
03  julia> Int8(100*10)
04  ERROR: InexactError() in Int8(::Int64) at ./sysimg.jl:53
05  julia> Int16(100*10)   #这个数被解释为16位
06  1000
07  julia> x = Int32(40); typeof(x)   #创建一个Int32类型的变量x
08  Int32
09  julia> x = Int8(x); typeof(x)   #使用类型转换,转换为8位的Int8
10  Int8

代码01行使用Int8()函数创建了一个字长为8位的值,没有错误。代码03行创建了一个Int8类型的值1000,但是由于1000超出了Int8类型的最大值,所以该行代码将报错。但是如果将其解释为Int16类型的值则不会报错。代码07行创建了一个Int32类型的变量x,求x的类型,结果为Int32。代码10行通过Int8()函数将x转换为Int8类型的变量。