- 第1节:Julia 简介
- 第2节:Julia 开始
- 第3节:Julia 变量
- 第4节:Julia 整数和浮点数
- 第5节:Julia 数学运算和基本函数
- 第6节:Julia 复数和分数
- 第7节:Julia 字符串
- 第8节:Julia 函数
- 第9节:Julia 控制流
- 第10节:Julia 变量的作用域
- 第11节:Julia 类型
- 第12节:Julia 方法
- 第13节:Julia 构造函数
- 第14节:Julia 类型转换和类型提升
- 第15节:Julia 模块
- 第16节:Julia 元编程
- 第17节:Julia 多维数组
- 第18节:Julia 线性代数
- 第19节:Julia 网络和流
- 第20节:Julia 并行计算
- 第21节:Julia 日期和时间
- 第22节:Julia 可空类型
- 第23节:Julia 交互
- 第24节:Julia 运行外部程序
- 第25节:Julia 调用 C 和 Fortran 代码
- 第26节:Julia 嵌入式 Julia
- 第27节:Julia 扩展包
- 第28节:Julia 开发扩展包
- 第29节:Julia 代码性能优化
- 第30节:Julia 代码样式
- 第31节:Julia 常见问题
- 第32节:Julia 与其他语言的区别
Julia 数学运算和基本函数
Julia 为它所有的基础数值类型,提供了整套的基础算术和位运算,也提供了一套高效、可移植的标准数学函数。
算术运算符
下面的算术运算符适用于所有的基本数值类型:
以及 Bool
类型的非运算:
Julia 的类型提升系统使得参数类型混杂的算术运算也很简单自然。详见类型转换和类型提升 。
算术运算的例子:
julia> 1 + 2 + 3
6
julia> 1 - 2
-1
julia> 3*2/12
0.5
(习惯上,优先级低的运算,前后多补些空格。这不是强制的。)
位运算符
下面的 位运算符 适用于所有整数类型:
位运算的例子:
julia> ~123
-124
julia> 123 & 234
106
julia> 123 | 234
251
julia> 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> 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
不等于、不大于、不小于任何数,包括它本身。
上面最后一条是关于 NaN
的性质,值得留意:
julia> NaN == NaN
false
julia> NaN != NaN
true
julia> NaN < NaN
false
julia> NaN > NaN
false
NaN
在矩阵中使用时会带来些麻烦:
julia> [1 NaN] == [1 NaN]
false
Julia 提供了附加函数, 用以测试这些特殊值,它们使用哈希值来比较:
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 支持 Python链式比较 :
julia> 1 < 2 <= 2 < 3 == 3 > 2 >= 1 == 1 < 3 != 5
true
对标量的比较,链式比较使用 &&
运算符;对逐元素的比较使用 &
运算符,此运算符也可用于数组。例如, 0 .< A .< 1
的结果是一个对应的布尔数组,满足条件的元素返回 true
。
操作符 .<
是特别针对数组的; 只有当 A
和 B
有着相同的大小时, A .< B
才是合法的。比较的结果是布尔型数组, 其大小同 A
和 B
相同. 这样的操作符被称为按元素操作符; Julia 提供了一整套的按元素操作符: .*
, .+
, 等等。 有的按元素操作符也可以接受纯量,
例如上一段的 0 .< A .< B
. 这种表示法的意思是, 相应的纯量操作符会被施加到每一 个元素上去。
注意链式比较的比较顺序:
v(x) = (println(x); x)
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 提供了一系列数学函数和运算符:
舍入函数
除法函数
符号函数和绝对值函数
乘方,对数和开方
为什么要有 hypot
, expm1
, log1p
等函数,参见 John D. Cook 的博客: expm1, log1p, erfc 和 hypot 。
三角函数和双曲函数
Julia 内置了所有的标准三角函数和双曲函数
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 之外,都是单参数函数。 atan2
给出了 x
轴,与由 x
、 y
确定的点之间的弧度 。
另外,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