整数和浮点数


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

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

  • 100 是一个整数文字

  • 100.50 是浮点文字

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

整数

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

julia> 100
100

julia> 123456789
123456789

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

julia> Sys.WORD_SIZE
64

julia> typeof(100)
Int64

整数类型

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

类型 签? 位数 最小值 最大值
整型8 8 -2^7 2^7 – 1
UInt8 8 0 2^8 – 1
整数16 16 -2^15 2^15 – 1
UInt16 16 0 2^16 – 1
整数32 32 -2^31 2^31 – 1
UInt32 32 0 2^32 – 1
整型64 64 -2^63 2^63 – 1
UInt64 64 0 2^64 – 1
整数128 128 -2^127 2^127 – 1
UInt128 128 0 2^128 – 1
布尔 不适用 8 假 (0) 正确 (1)

溢出Behave

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

julia> A = typemax(Int64)
9223372036854775807

julia> A + 1
-9223372036854775808

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

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

下面是溢出Behave的示例以及我们如何解决它 -

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 中的浮点类型 -

类型 精确 位数
浮点16 一半 16
浮点32 单身的 32
浮点64 双倍的 64

浮点零

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

julia> 0.0 == -0.0
true

julia> bitstring(0.0)
"0000000000000000000000000000000000000000000000000000000000000000"

julia> bitstring(-0.0)
"1000000000000000000000000000000000000000000000000000000000000000"

特殊浮点值

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

浮点16 浮点32 浮点64 姓名 描述
因夫16 因夫32 信息 正无穷大 它是大于所有有限浮点值的值
-Inf16 -Inf32 -信息 负无穷大 它是小于所有有限浮点值的值
氮化钠16 氮化钠 不是一个数字 它是一个不 == 任何浮点值(包括其本身)的值

我们还可以应用 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 很重要,因为大多数实数无法用浮点数精确表示。

在 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