整数和浮点数是算术和计算的基础。它们都是数字文本。例如 1
是整数文本, 1.0
是浮点数文本。
Julia 提供了丰富的基础数值类型,全部的算数运算符和位运算符,以及标准数学函数。这些数据和操作直接对应于现代计算机支持的操作。因此, Julia 能充分利用硬件的计算资源。另外, Julia 还从软件层面支持任意精度的算术 ,可以用于表示硬件不能原生支持的数值,当然,这牺牲了部分运算效率。
Julia 提供的基础数值类型有:
Char
原生支持 Unicode 字符 ;详见字符串 。
浮点数类型:
类型 | 精度 | 位数 |
---|---|---|
Float16
|
半精度 | 16 |
Float32
|
单精度 | 32 |
Float64
|
双精度 | 64 |
另外, 对复数和分数的支持建立在这些基础数据类型之上。所有的基础数据类型通过灵活用户可扩展的类型提升系统不需显式类型转换,就可以互相运算。
使用标准方式来表示文本化的整数:
julia> 1 |
1 |
julia> 1234 |
1234 |
# 32-bit system: |
julia> typeof(1) |
Int32 |
# 64-bit system: |
julia> typeof(1) |
Int64 |
Julia 内部变量 `WORD_SIZE` 用以指示目标系统是 32 位还是 64 位. |
# 32-bit system: |
julia> WORD_SIZE |
32 |
# 64-bit system: |
julia> WORD_SIZE |
64 |
Int
和 Uint
类型,它们分别是系统原生的有符号和无符号整数类型的别名:
# 32-bit system: |
julia> Int |
Int32 |
julia> Uint |
Uint32 |
# 64-bit system: |
julia> Int |
Int64 |
julia> Uint |
Uint64 |
# 32-bit or 64-bit system: |
julia> typeof(3000000000) |
Int64 |
0x
和十六进制数字 0-9a-f
(也可以使用 A-F
)。无符号数的位数大小,由十六进制数的位数决定:
julia> 0x1 |
0x01 |
julia> typeof(ans) |
Uint8 |
julia> 0x123 |
0x0123 |
julia> typeof(ans) |
Uint16 |
julia> 0x1234567 |
0x01234567 |
julia> typeof(ans) |
Uint32 |
julia> 0x123456789abcdef |
0x0123456789abcdef |
julia> typeof(ans) |
Uint64 |
julia> 0b10 |
0x02 |
julia> typeof(ans) |
Uint8 |
julia> 0o10 |
0x08 |
julia> typeof(ans) |
Uint8 |
typemin
和 typemax
函数查询:
julia> (typemin(Int32), typemax(Int32)) |
(-2147483648,2147483647) |
julia> for T = {Int8,Int16,Int32,Int64,Int128,Uint8,Uint16,Uint32,Uint64,Uint128} |
println("$(lpad(T,7)): [$(typemin(T)),$(typemax(T))]") |
end |
Int8: [-128,127] |
Int16: [-32768,32767] |
Int32: [-2147483648,2147483647] |
Int64: [-9223372036854775808,9223372036854775807] |
Int128: [-170141183460469231731687303715884105728,170141183460469231731687303715884105727] |
Uint8: [0,255] |
Uint16: [0,65535] |
Uint32: [0,4294967295] |
Uint64: [0,18446744073709551615] |
Uint128: [0,340282366920938463463374607431768211455] |
typemin
和 typemax
的返回值,与所给的参数类型是同一类的。(上述例子用到了一些将要介绍到的特性,包括 for 循环 ,字符串 ,及内插 。)
在 Julia 中,如果计算结果超出数据类型所能代表的最大值,将会发生溢出:
julia> x = typemax(Int64) |
9223372036854775807 |
julia> x + 1 |
-9223372036854775808 |
julia> x + 1 == typemin(Int64) |
true |
可见, Julia 中的算数运算其实是一种同余算术 。它反映了现代计算机底层整数算术运算特性。如果有可能发生溢出,一定要显式的检查是否溢出;或者使用 BigInt
类型(详见任意精度的算术 )。
为了减小溢出所带来的影响,整数加减法、乘法、指数运算都会把原先范围较小的整数类型提升到 Int
或 Uint
类型。(除法、求余、位运算则不提升类型)。
除法错误
整数除法(div
功能)有两个额外的样例:被 0 除,和被最低的负数(typemin
)-1 除。两个例子都抛出了一个 DivideError
。余数和模运算(rem
和 mod
)当它们的第二个参数为 0 时,抛出了一个 DivideError
。
浮点数
使用标准格式来表示文本化的浮点数:
julia> 1.0 |
1.0 |
julia> 1. |
1.0 |
julia> 0.5 |
0.5 |
julia> .5 |
0.5 |
julia> -1.23 |
-1.23 |
julia> 1e10 |
1.0e10 |
julia> 2.5e-4 |
0.00025 |
Float64
值。文本化的 Float32
值也可以直接输入,这时使用 f
来替代 e
:
julia> 0.5f0 |
0.5f0 |
julia> typeof(ans) |
Float32 |
julia> 2.5f-4 |
0.00025f0 |
Float32
:
julia> float32(-1.5) |
-1.5f0 |
julia> typeof(ans) |
Float32 |
Float64
:
julia> 0x1p0 |
1.0 |
julia> 0x1.8p3 |
12.0 |
julia> 0x.4p-1 |
0.125 |
julia> typeof(ans) |
Float64 |
Float16
) ,但只用来存储。计算时,它们被转换为 Float32
:
julia> sizeof(float16(4.)) |
2 |
julia> 2*float16(4.) |
8.0f0 |
浮点数类型中存在两个零 ,正数的 零和负数的零。它们相等,但有着不同的二进制表示,可以使用 bits
函数看出:
julia> 0.0 == -0.0 |
true |
julia> bits(0.0) |
"0000000000000000000000000000000000000000000000000000000000000000" |
julia> bits(-0.0) |
"1000000000000000000000000000000000000000000000000000000000000000" |
有三个特殊的标准浮点数:
特殊值 | 名称 | 描述 | ||
Float16 | Float32 | Float64 | ||
Inf16 | Inft32 | Inf | 正无穷 | 比所有的有限的浮点数都大 |
-Inf16 | -Inft32 | -Inf | 负无穷 | 比所有的有限的浮点数都小 |
NaN16 | NaN32 | NaN | 不存在 | 不能和任意浮点数比较大小(包括它自己) |