Julia 整数和浮点数

整数和浮点数

整数和浮点数是算术和计算的基础。它们都是数字文本。例如 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)
Float64
Julia 也支持半精度浮点数(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 不存在 不能和任意浮点数比较大小(包括它自己)
联系我们

邮箱 626512443@qq.com
电话 18611320371(微信)
QQ群 235681453

Copyright © 2015-2022

备案号:京ICP备15003423号-3