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