文章目录
- 2 数据类型
- 2.1 整数
- 2.2 浮点数
- 2.3 机器精度
- 2.4 舍入模式
- 2.5 数值字面量系数
- 2.6 零和一的字面量
2 数据类型
2.1 整数
如果想要在julia中输入整数字面值。如下:
julia> 3+4
7
至于你的整数字面值默认是什么数据类型,这取决于目标系统是32位还是64位架构。查看字面值或变量的数据类型使用typeof()方法,如下:
julia> typeof(1)
Int64julia> typeof(124.4)
Float64
如果想要查看目标系统是32位还是64位架构,可以使用内置变量Sys.WORD_SIZE
进行查看。
julia> Sys.WORD_SIZE
64
Julia定义了Int
和UInt
类型,它们分别是系统有符号和无符号的原生整数类型的别名。
# 32 位系统:
julia> Int
Int32
julia> UInt
UInt32# 64 位系统:
julia> Int
Int64
julia> UInt
UInt64
如果你的数超过了32位表示的范围,但能用64位表示,那么无论是什么系统都可以用64位表示。
# 32 位或 64 位系统:
julia> typeof(3000000000)
Int64
那如何知道一个内置数据类型可以表示的范围呢?typemin和typemax可以查看它们能够表示的最小值和能够表示的最大值。
julia> (typemin(Int32),typemax(Int32))
(-2147483648, 2147483647)
一旦一个数超过了一个类型所能表示的最大值,则会出现环绕行为,这对于学过C++或者Java的应该都能理解。
julia> x = typemax(Int64)
9223372036854775807julia> x + 1
-9223372036854775808julia> x + 1 == typemin(Int64)
true
在进行一些大数值的计算时,防止环绕现象是十分有必要的,故我们推荐使用任意精度算术中的BigInt
类型来作为替代。
如果一个数值溢出,可以采取以下的方式来解决这个错误。
julia> 10^19
-8446744073709551616julia> big(10)^19
10000000000000000000
2.2 浮点数
浮点数字面量以标准格式表示,必要时可以使用E-表示法
。
julia> 1.0
1.0julia> 1.
1.0julia> 0.5
0.5julia> .5
0.5julia> -1.23
-1.23julia> 1e10
1.0e10julia> 2.5e-4
0.00025
如果用e则为64位浮点数,如果用f则为32位浮点数。如:
julia> x = 0.5f0
0.5f0julia> typeof(x)
Float32julia> 2.5f-4
0.00025f0
如果想要将浮点64位数据转为浮点32位数据,则通过以下的方式可以解决这个问题。
julia> x = -1.5
-1.5julia> typeof(x)
Float64julia> x = Float32(x)
-1.5f0julia> typeof(x)
Float32
julia支持表示正负零,但我们都知道,数学中正负零都是零,没有区别。
julia> 0.0 == -0.0
truejulia> bitstring(0.0)
"0000000000000000000000000000000000000000000000000000000000000000"julia> bitstring(-0.0)
"1000000000000000000000000000000000000000000000000000000000000000"
julia也可以表示无穷大,具体如下表:
Float16 | Float32 | Float64 | 名称 | 描述 |
---|---|---|---|---|
Inf16 | Inf32 | Inf | 正无穷 | 一个大于所有有限浮点数的数 |
-Inf16 | -Inf32 | -Inf | 负无穷 | 一个小于所有有限浮点数的数 |
NaN16 | NaN32 | NaN | 不是数(Not a Number) | 一个不和任何浮点值(包括自己)相等(== )的值 |
由于我的电脑是64位的,故如果我想使用无穷大,只需使用Inf变量即可。如1除以正无穷应该是正无穷小:
julia> 1/Inf
0.0
2.3 机器精度
大多数实数都无法用浮点数准确表示,这是因为机器的精度有限。我们有必要知道两个相邻可表示的浮点数间的距离。他通常被叫做机器精度
。
Julia 提供了 eps
函数,它可以给出 1.0
与下一个 Julia 能表示的浮点数之间的差值。
对于eps函数来说,其传入的x就是下一个julia能表示的浮点数之间的差值。如:
julia> eps(Float32) #相当于1和2.0^23在机器中表示的差距
1.1920929f-7julia> eps(Float64)
2.220446049250313e-16julia> eps() # 与 eps(Float64) 相同
2.220446049250313e-16
2.4 舍入模式
一个数如果没有精确的浮点表示,那么就必须被舍入到一个合适的可表示的值。舍入方式使用的是IEEE754标准。
2.5 数值字面量系数
为了让一些多项式表达和公式表达更为明了,julia允许变量直接跟在一个数字字面量后,如1x
,这实际上为乘法关系1*x
。
julia> x = 3
3julia> 2x^2 - 3x + 1
10julia> 1.5x^2 - .5x + 1
13.0
需要注意的是,由于运算符有优先级,故我们建议打上括号。如:
# 2x^2实际上为2(x^2)
# 如果你想表示2x的2次方,建议写为(2x)^2
julia> x = 3
3julia> 2x^2
18julia> (2x)^2
36
括号表达式也可以位于变量前而不用写运算符,暗指乘法,如:
julia> x = 3
3julia> (x-1)x
6
但是括号表达式位于括号表达式前则必须写运算符。
julia> (x-1)(x+1)
ERROR: MethodError: objects of type Int64 are not callable
Maybe you forgot to use an operator such as *, ^, %, / etc. ?
Stacktrace:[1] top-level scope@ REPL[12]:1
2.6 零和一的字面量
julia也提供了0和1的字面量函数,可以返回特定类型或所给变量的类型。这些函数在数值比较中可以用来避免不必要的类型转换带来的开销。
julia> zero(Float32)
0.0f0julia> zero(1.0)
0.0julia> one(Int32)
1julia> one(BigFloat)
1.0