Julia - 整数和浮点数

在任何编程语言中,都有算术和计算两个基本构建块。 它们是整数浮点值整数浮点值的内置表示称为数字基元。 另一方面,它们在代码中表示为立即值,称为数字文字

以下是整数和浮点文字的示例 −

  • 100 是一个整数文字

  • 100.50 是浮点文字

  • 它们作为对象的内置内存表示是数字基元。

整数

Integer 是 Julia 中的原始数字类型之一。 表示如下 −

julia> 100
100

julia> 123456789
123456789

我们可以检查整数文字的默认类型,这取决于我们的系统是32位还是64位架构。

julia> Sys.WORD_SIZE
64

julia> typeof(100)
Int64

整数类型

下表显示了 Julia 中的整数类型 −

类型 Signed? 位数 最小值 最大值
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)

溢出行为

在 Julia 中,如果超过给定类型的最大可表示值,则会导致环绕行为。 例如 −

julia> A = typemax(Int64)
9223372036854775807

julia> A + 1
-9223372036854775808

julia> A + 1 == typemin(Int64)
true

建议显式检查溢出产生的环绕,特别是在可能溢出的情况下。 否则使用任意精度算术中的BigInt类型。

下面是溢出行为的示例以及我们如何解决它 −

julia> 10^19
-8446744073709551616

julia> big(10)^19
10000000000000000000

除法错误

在以下两种特殊情况下,整数除法会抛出 DivideError

  • 除以零

  • 除以最小的负数

只要第二个参数为零,rem(余数)和 mod(模数)函数就会抛出 DivideError。 下面给出示例 −

julia> mod(1, 0)
ERROR: DivideError: integer division error
Stacktrace:
 [1] div at .\int.jl:260 [inlined]
 [2] div at .\div.jl:217 [inlined]
 [3] div at .\div.jl:262 [inlined]
 [4] fld at .\div.jl:228 [inlined]
 [5] mod(::Int64, ::Int64) at .\int.jl:252
 [6] top-level scope at REPL[52]:1
 
 
julia> rem(1, 0)
ERROR: DivideError: integer division error
Stacktrace:
 [1] rem(::Int64, ::Int64) at .\int.jl:261
 [2] top-level scope at REPL[54]:1

浮点数

Julia 中的另一种原始数字类型是浮点数。 其表示方式(需要时使用E符号)如下 −

julia> 1.0
1.0

julia> 0.5
0.5

julia> -1.256
-1.256

julia> 2e11
2.0e11

julia> 3.6e-5
3.6e-5

以上结果均为Float64。 如果我们想输入 Float32 文字,可以通过在 e 处写入 f 来编写,如下所示 −

julia> 0.5f-5
5.0f-6

julia> typeof(ans)
Float32

julia> 1.5f0
1.5f0

julia> typeof(ans)
Float32

浮点类型

下表显示了 Julia 中的浮点类型 −

类型 精度 位数
Float16 half 16
Float32 single 32
Float64 double 64

浮点零

浮点零有两种,一种是正零,另一种是负零。 它们是相同的,但它们的二进制表示不同。 从下面的例子可以看出 −

julia> 0.0 == -0.0
true

julia> bitstring(0.0)
"0000000000000000000000000000000000000000000000000000000000000000"

julia> bitstring(-0.0)
"1000000000000000000000000000000000000000000000000000000000000000"

特殊浮点值

下表表示三个指定的标准浮点值。 这些浮点值不对应于实数轴上的任何点。

Float16 Float32 Float64 名称 描述
Inf16 Inf32 Inf 正无穷 它是大于所有有限浮点值的值
-Inf16 -Inf32 -Inf 负无穷 小于所有有限浮点值的值
NaN16 NaN32 NaN 不是数字 它是一个不 == 任何浮点值(包括其本身)的值

我们还可以应用 typemin 和 typemax 函数,如下所示 −

julia> (typemin(Float16),typemax(Float16))
(-Inf16, Inf16)

julia> (typemin(Float32),typemax(Float32))
(-Inf32, Inf32)

julia> (typemin(Float64),typemax(Float64))
(-Inf, Inf)

机器 epsilon

机器 epsilon 是两个相邻的可表示浮点数之间的距离。 了解机器 epsilon 非常重要,因为大多数实数无法用浮点数精确表示。

在 Julia 中,我们有 eps() 函数,它可以给出 1.0 和下一个更大的可表示浮点值之间的距离。 下面给出示例 −

julia> eps(Float32)
1.1920929f-7

julia> eps(Float64)
2.220446049250313e-16

舍入模式

众所周知,如果数字没有精确的浮点表示,则应将其四舍五入为适当的可表示值。 Julia 使用名为 RoundNearest 的默认模式。 它四舍五入到最接近的整数,并四舍五入到最接近的偶数。 例如,

julia> BigFloat("1.510564889",2,RoundNearest)
1.5