Julia系列2nd -数据类型

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的整数类型,我们需要考虑两个方面:

  1. 有无符号
  2. 位数

Julia在确定字面值的过程中:

符号上:十进制数自动确定为有符号整型,其他进制的数处理为无符号整数。
位数上:十进制数会默认选择与OS的位数保持一致,若数字过大,则会选择更大的位数;而对于其他进制的数,则依据值的大小选择恰当的位数。

根据需要,我们可以使用:

  1. unsigned() ----- 将有符号数转为无符号数,忽略负值检查;
  2. signed() -------- 将无符号数转为有符号数,忽略范围越界;

这两个函数在转换时会讲原值变成位数相同的无符号或有符号数。慎用!!!


1.2 进制问题
  1. 0x ---- 表示十六进制数
  2. 0b ---- 表示二进制数
  3. 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专门为我们提供了两个有趣的函数:

  1. zero(x): 生成x的0;
  2. one(x): 生成x的1;

2.3 特殊的浮点数
Float16 Float32 Float64 解释 描述
Inf16 Inf32 Inf 正无穷 大于该类型所能表达的所有有限浮点值
-Inf16 -Inf32 -Inf 负无穷 小于该类型所能表达的所有有限浮点值
NaN16 NaN32 NaN Not a Number 不和任何浮点数(包括自己)相等

需要我们注意以下几点:

  1. 有了无穷的存在,Julia中的「浮点运算」就可以正常的除零操作(不推荐使用);
  2. 通过**isfinite(x)isinf(x)**来判断是否是无穷;
  3. 通过**isnan(x)**来判断是否是NaN;

你会不会有Inf16 > Inf 的疑问呢?

julia> typemax(Float16) < typemax(Float64)
false

  1. 大数运算使用BigInt,BigFloat
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章