Julia学习笔记(一):变量、数值与运算
作者:互联网
交互式会话REPL
- 一旦用户输入了一段完整的代码(表达式),然后按回车,交互式会话就会执行这段代码,并将结果显示出来。如果输入的代码以分号结尾,那么结果将不会显示出来。
- 变量 a n s ans ans总会存储上一次执行代码的结果,需要注意的是,变量 a n s ans ans只在交互式会话中才有。
REPL模式:
- ?进入help模式(查看帮助文档)或者用@doc <函数名>
- ;进入shell模式(执行shell命令)
- ]进入package模式(增删库)add/rm <库名>(或者using Pkg,然后Pkg.add)
- b a c k s p a c e backspace backspace返回正常Julia格式
变量
- 变量是与某个值相关联(或绑定)的名字。可以用它来保存一个值(例如某些计算得到的结果),供之后的代码使用。
- 变量名是大小写敏感的,且不包含语义
- Unicode数学符号可以用反斜杠+LaTeX再按tab打出
合法变量名
唯一明确禁止的变量名称是内置关键字的名称。
命名规范
- 变量的名字采用小写。
- 用下划线(_)分隔名字中的单词,但是不鼓励使用下划线, 除非在不使用下划线时名字会非常难读。
- 类型(Type)和模块(Module)的名字使用大写字母开头,并且用大写字母 而不是用下划线分隔单词。
- 函数(Function)和宏(Macro)的名字使用小写,不使用下划线。
- 会对输入参数进行更改的函数要使用 ! 结尾。这些函数有时叫做 “mutating” 或 “in-place” 函数,因为它们在被调用后,不仅仅会返回一些值 还会更改输入参数的内容。
整数、浮点数
整数和浮点值是算术和计算的基础。这些数值的内置表示被称作原始数值类型(numeric primitive),且整数和浮点数在代码中作为立即数时称作数值字面量(numeric literal)。
整数类型
类型 | 带符号? | 比特数 | 最小值 | 最大值 |
---|---|---|---|---|
Int8 | √ | 8 | -2^7 | 2^7-1 |
UInt8 | 8 | 0 | 2^8-1 | |
Int16 | √ | 16 | -2^15 | 2^15-1 |
UInt16 | 16 | 0 | 2^16-1 | |
Int32 | √ | 32 | -2^31 | 2^31-1 |
UInt32 | 32 | 0 | 2^32-1 | |
Int64 | √ | 64 | -2^63 | 2^63-1 |
UInt64 | 64 | 0 | 2^64-1 | |
Int128 | √ | 128 | -2^127 | 2^127-1 |
UInt128 | 128 | 0 | 2^128-1 | |
Bool | N/A | 8 | false(0) | true(1) |
- 无符号整数会通过0x前缀以及十六进制数0-9a-f来输入和输出(输入也可以使用大写的A-F)。
- 整型等原始数值类型的最小和最大可表示的值可用typemin和typemax函数得到。
浮点数
类型 | 精度 | 比特数 |
---|---|---|
Float16 | half | 16 |
Float32 | single | 32 |
Float64 | double | 64 |
特殊浮点值
Float16 | Float32 | Float64 | 名称 | 描述 |
---|---|---|---|---|
Inf16 | Inf32 | Inf | 正无穷 | 一个大于所有有限浮点数的数 |
-Inf16 | -Inf32 | -Inf | 负无穷 | 一个小于所有有限浮点数的数 |
NaN16 | NaN32 | NaN | 不是数 | 一个不和任何浮点值(包括自己)相等的值 |
机器精度
- Julia提供了eps函数,它可以给出1.0与下一个Julia能表示的浮点数之间的差值。参数可以是一个浮点数,也可以是一个类型。
- Julia也提供了nextfloat和prevfloat两个函数分别返回基于参数的下一个更大或更小的可表示的浮点数。
Note.两个相邻可表示的浮点数之间的距离并不是常数,数值越小,间距越小,数值越大,间距越大。
舍入模式
Julia所使用的默认模式总是RoundNearest,指舍入到最接近的可表示的值,这个被舍入的值会使用尽量少的有效位数。
数值字面量系数
为了让常见的数值公式和表达式更清楚,Julia允许变量直接跟在一个数值字面量后,暗指乘法。另外,数值字面量也能作为被括号表达式的系数,括号表达式也可以被用作变量的系数。
julia> x = 3;
julia> 2x^2 - 3x + 1
10
julia> 2(x-1)^2 - 3(x-1) + 1
3
Note.
- 用于隐式乘法的数值字面量系数的优先级高于其它的二元运算符,例如乘法(*)和除法(/、\以及//)。
- 无论是把两个括号表达式并列,还是把变量放在括号表达式之前,都不会被用作暗指乘法,而是由于被解释为函数调用而报错。
julia> (x-1)(x+1)
ERROR: MethodError: objects of type Int64 are not callable
零和一字面量
函数 | 描述 |
---|---|
zero(x) | x类型或变量x类型的零字面量 |
one(x) | x类型或变量x类型的一字面量 |
Note.在比较中可避免不必要的类型转换开销。
数学运算和初等函数
算术运算符
表达式 | 名称 | 操作 |
---|---|---|
+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) |
Bool类型:
表达式 | 名称 | 描述 |
---|---|---|
!x | 否定 | 互换true与false |
位运算符
所有原始整数类型都支持以下位运算符:
表达式 | 名称 |
---|---|
~x | 按位取反 |
x&y | 按位与 |
x|y | 按位或 |
x$y | 按位异或 |
x>>>y | 向右逻辑移位(高位补0) |
x>>y | 向右算术移位(复制原高位) |
x<<y | 向左逻辑/算数移位 |
复合赋值操作符
每一个二元运算符和位运算符都可以给左操作数复合赋值:方法是把 = 直接放在二元运算符后面。
+= -= *= /= = ÷= %= ^= &= |= ⊻= >>>= >>= <<=
Note. 复合赋值后会把变量重新绑定到左操作数上,所以变量的类型可能会改变。
向量化dot运算符
每个二元运算符都有一个dot运算符与之对应,例如 ^ 就有对应的 .^ 存在。这个对应的.^被Julia自动地定义为逐元素地执行 ^ 运算。
Note 将点运算符用于数值字面量可能会导致歧义。例如,1.+x到底是表示1.+x还是1.+x?这会令人疑惑。因此不允许使用这种语法,遇到这种情况时,必须明确地用空格消除歧义。
数值比较
数值比较符
表达式 | 含义 |
---|---|
== | 等于 |
!= | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
- 整数是按位比较的,浮点数是按IEEE 754标准比较的
- Inf等于它本身,且大于所有数,除了NaN
- -Inf等于它本身,且小于所有数,除了NaN
- NaN不等于、不大于、不小于任何数,包括它本身
测试函数
函数 | 测试是否满足如下性质 |
---|---|
isequal(x,y) | x与y是完全相同的 |
isfinite(x) | x是有限大的数字 |
isinf(x) | x是(正/负)无穷大 |
isnan(x) | x是NaN |
Note
- isequal认为NaN之间是相等的
- isequal也能用来区分带符号的零
- 对于其它类型,isequal会默认调用==,所以如果你想给自己的类型定义相等,那么就只需要为 ==增加一个方法。如果你想定义一个你自己的相等函数,你可能需要定义一个对应的hash方法,用于确保isequal(x,y)隐含着hash(x)==hash(y)。
链式比较
Julia允许链式比较:
julia> 1 < 2 <= 2 < 3 == 3 > 2 >= 1 == 1 < 3 != 5
true
运算符的优先级与结合性
分类 | 运算符 | 结合性 |
---|---|---|
语法 | .followed by:: | 左结合 |
幂运算 | ^ | 右结合 |
一元运算符 | + - √ | 右结合 |
移位运算 | << >> >>> | 左结合 |
除法 | // | 左结合 |
乘法 | * / % & \ ÷ | 左结合 |
加法 | + - | $ | 左结合 |
语法 | : … | 左结合 |
语法 | |> | 左结合 |
语法 | <| | 右结合 |
比较 | > < >= <= == === != !== <: | 无结合性 |
流程控制 | && followed by || followed by ? | 右结合 |
Pair 操作 | => | 右结合 |
赋值 | = += -= *= /= //= = ^= ÷= %= | = &= ⊻= <<= >>= >>>= |
数值转换
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)) 的简写版。
舍入函数
函数 | 描述 | 返回类型 |
---|---|---|
round(x) | x舍到最接近的整数 | typeof(x) |
round(T, x) | x舍到最接近的整数 | T |
floor(x) | x向-Inf 舍入 | typeof(x) |
floor(T, x) | x向-Inf 舍入 | T |
ceil(x) | x向+Inf方向取整 | typeof(x) |
ceil(T, x) | x向+Inf方向取整 | T |
trunc(x) | x向0取整 | typeof(x) |
trunc(T, x) | x向0取整 | T |
除法函数
函数 | 描述 |
---|---|
div(x,y), x÷y | 截断除法;商向零近似 |
fld(x,y) | 向下取整除法;商向-Inf近似 |
cld(x,y) | 向上取整除法;商向+Inf近似 |
rem(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) 偏移 1 的 mod;若 y>0,则返回 r∈(0,y],若 y<0,则 r∈[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 的模的平方 |
sign(x) | 表示 x 的符号,返回 -1,0,或 +1 |
signbit(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接近0时的exp(x)-1的精确值 |
ldexp(x,n) | x*2^n的高效算法,n为整数 |
log(x) | x的自然对数 |
log(b,x) | 以b为底x的对数 |
log2(x) | 以2为底x的对数 |
log10(x) | 以10为底x的对数 |
log1p(x) | 当 x接近 0 时的 log(1+x) 的精确值 |
exponent(x) | x 的二进制指数 |
significand(x) | 浮点数 x 的二进制有效数(也就是尾数) |
三角和双曲函数
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
Note
- 所有这些函数都是单参数函数,不过 atan 也可以接收两个参数 来表示传统的 atan2 函数。
- 另外,sinpi(x) 和 cospi(x) 分别用来对 sin(pix) 和 cos(pix) 进行更精确的计算。
- 要计算角度而非弧度的三角函数,以 d 做后缀。 比如,sind(x) 计算 x 的 sine 值,其中 x 是一个角度值。
复数和有理数
复数
全局常量 im 被绑定到复数 i,表示 -1的主平方根。
Note. 注意 3/4im == 3/(4im) == -(3/4im),因为系数比除法的优先级更高。
Julia 提供了一些操作复数的标准函数:
函数 | 含义 |
---|---|
real() | 实部 |
imag() | 虚部 |
conj() | 复共轭 |
abs() | 绝对值 |
abs2() | 平方后绝对值 |
angle() | 以弧度为单位的相位角 |
Note
- 从变量构建复数时,文本型数值系数记法不再适用。应改为使用更高效的 complex 函数直接通过实部与虚部构建一个复数值:
julia> a = 1; b = 2; complex(a, b)
1 + 2im
- Inf 和 NaN 可能出现在复数的实部和虚部。
julia> 1 + Inf*im
1.0 + Inf*im
julia> 1 + NaN*im
1.0 + NaN*im
有理数
Julia 有一个用于表示整数精确比值的分数类型。分数通过 // 运算符构建:
julia> 2//3
2//3
如果一个分数的分子和分母含有公因子,它们会被约分到最简形式且分母非负。整数比值的这种标准化形式是唯一的,所以分数值的相等性可由校验分子与分母都相等来测试。分数值的标准化分子和分母可以使用numerator()和denominator()函数得到。
Julia接受构建无穷分数值,但不接受试图构建一个 NaN 分数值:
julia> 5//0
1//0
julia> 0//0
ERROR: ArgumentError: invalid rational: zero(Int64)//zero(Int64)
Stacktrace:
[...]
标签:函数,浮点数,数值,运算符,笔记,Julia,Inf,运算 来源: https://blog.csdn.net/weixin_44104200/article/details/118083613