整数和浮点数
在任何编程语言中,都有算术和计算两个基本构建块。它们是整数和浮点值。整数和浮点值的内置表示称为数字基元。另一方面,它们在代码中表示为立即值,称为数字文字。
以下是整数和浮点文字的示例 -
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 中的浮点类型 -
浮点零
浮点零有两种,一种是正零,另一种是负零。它们是相同的,但它们的二进制表示不同。从下面的例子可以看出 -
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