Julia主要用于科学计算,所以对于数据类型的支持是相当完备的…
有过编程开发经验的人,都知道编程语言都离不开整数和浮点数… 下面我们就从这两方面入手。
- typemin()可以查看数据类型的最小值
- typemax()可以查看数据类型的最大值
- bitstring()可以查看数的二进制表示
- typeof()可以查看任意对象的类型
1. 整数(和布尔)类型
Julia是支持无符号整数和有符号整数的…,在Julia中,布尔类型是可以和整型相互转化的。(Pythoner 哭晕在厕所里…)
类型 | 符号 | 比特位 | 最小值 | 最大值 |
---|---|---|---|---|
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 | – | 8 | false(0) | true(1) |
1.1 整数类型的特点
对于Julia的整数类型,我们需要考虑两个方面:
- 有无符号
- 位数
Julia在确定字面值的过程中:
符号上:十进制数自动确定为有符号整型,其他进制的数处理为无符号整数。
位数上:十进制数会默认选择与OS的位数保持一致,若数字过大,则会选择更大的位数;而对于其他进制的数,则依据值的大小选择恰当的位数。
根据需要,我们可以使用:
- unsigned() ----- 将有符号数转为无符号数,忽略负值检查;
- signed() -------- 将无符号数转为有符号数,忽略范围越界;
这两个函数在转换时会讲原值变成位数相同的无符号或有符号数。慎用!!!
1.2 进制问题
- 0x ---- 表示十六进制数
- 0b ---- 表示二进制数
- 0o ---- 表示八进制数
需要强调的是:这里的x,b,o只能是小写字母。
无符号整数会以十六进制的方式展示
1.3 布尔类型(bool)
不能将整型当作bool使用
2. 浮点类型
类型 | 精度 | 比特位 | 最小值 | 最大值 |
---|---|---|---|---|
Float16 | half(半精度) | 16 | -Inf16 | Inf16 |
Float32 | single(单精度) | 32 | -Inf32 | Inf32 |
Float64 | double(双精度) | 64 | -Inf | Inf |
浮点类型是按照所能表示的精度来划分的。
Float16基本上用不到,根据官方文档的说明,Float16是使用Float32进行模拟实现的。如何理解这句话呢?即就算我们遇到Float16的数值,其在内部运算时依然按照Float32进行。
2.1 精度及eps函数
我们知道计算机内部都是二进制的,逻辑判断非常简单(非0则1),但是在表达力方面还是有所欠缺的。浮点数在计算机中基本无法准确的表示。
机器精度:计算机中两个相邻可表示的浮点数之间的误差。
Julia 提供了eps()函数 帮助我们去查看1.0和下一个Julia能正确表示的浮点数之间的差值。更加详细的内容可以去REPL中的帮助模式中查看。
2.2 零及zero(),one()函数
在Julia中,浮点数中有两个零:正零(0.0)和负零(-0.0)
julia> 0.0 == -0.0
true
julia> bitstring(0.0)
"0000000000000000000000000000000000000000000000000000000000000000"
julia> bitstring(-0.0)
"1000000000000000000000000000000000000000000000000000000000000000"
虽然两者相等,但是我们发现其在内存中的表示却不一样。这自己挖坑自己跳的节奏啊…
为了避免出现问题,Julia专门为我们提供了两个有趣的函数:
- zero(x): 生成x的0;
- one(x): 生成x的1;
2.3 特殊的浮点数
Float16 | Float32 | Float64 | 解释 | 描述 |
---|---|---|---|---|
Inf16 | Inf32 | Inf | 正无穷 | 大于该类型所能表达的所有有限浮点值 |
-Inf16 | -Inf32 | -Inf | 负无穷 | 小于该类型所能表达的所有有限浮点值 |
NaN16 | NaN32 | NaN | Not a Number | 不和任何浮点数(包括自己)相等 |
需要我们注意以下几点:
- 有了无穷的存在,Julia中的「浮点运算」就可以正常的除零操作(不推荐使用);
- 通过**isfinite(x)和isinf(x)**来判断是否是无穷;
- 通过**isnan(x)**来判断是否是NaN;
你会不会有Inf16 > Inf 的疑问呢?
julia> typemax(Float16) < typemax(Float64)
false
- 大数运算使用BigInt,BigFloat