整数和浮点数是算术和计算的基础。它们都是数字文本。例如 1
是整数文本, 1.0
是浮点数文本。
Julia 提供了丰富的基础数值类型,全部的算数运算符和位运算符,以及标准数学函数。这些数据和操作直接对应于现代计算机支持的操作。因此, Julia 能充分利用硬件的计算资源。另外, Julia 还从软件层面支持任意精度的算术 ,可以用于表示硬件不能原生支持的数值,当然,这牺牲了部分运算效率。
Julia 提供的基础数值类型有:
Char
原生支持 Unicode 字符 ;详见字符串 。
浮点数类型:
类型 | 精度 | 位数 |
---|---|---|
Float16
|
半精度 | 16 |
Float32
|
单精度 | 32 |
Float64
|
双精度 | 64 |
另外, 对复数和分数的支持建立在这些基础数据类型之上。所有的基础数据类型通过灵活用户可扩展的类型提升系统不需显式类型转换,就可以互相运算。
使用标准方式来表示文本化的整数:
julia> 1 1 julia> 1234 1234整数文本的默认类型,取决于目标系统是 32 位架构还是 64 位架构:
# 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另外,Julia 定义了
Int
和 Uint
类型,它们分别是系统原生的有符号和无符号整数类型的别名:
# 32-bit system: julia> Int Int32 julia> Uint Uint32 # 64-bit system: julia> Int Int64 julia> Uint Uint64对于不能用 32 位而只能用 64 位来表示的大整数文本,不管系统类型是什么,始终被认为是 64 位整数
# 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) Float64Julia 也支持半精度浮点数(
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 | 不存在 | 不能和任意浮点数比较大小(包括它自己) |