Julia-整数和浮点数

整数和浮点值是算术和计算的基础。这些数值的内置表示被称作原始数值类型(numeric primitive),且整数和浮点数在代码中作为立即数时称作数值字面量(numeric literal)。例如,1 是个整型字面量,1.0 是个浮点型字面量,它们在内存中作为对象的二进制表示就是原始数值类型。

Julia 提供了很丰富的原始数值类型,并基于它们定义了一整套算术操作,还提供按位运算符以及一些标准数学函数。这些函数能够直接映射到现代计算机原生支持的数值类型及运算上,因此 Julia 可以充分地利用运算资源。此外,Julia 还为任意精度算术提供了软件支持,对于无法使用原生硬件表示的数值类型,Julia 也能够高效地处理其数值运算。当然,这需要相对的牺牲一些性能。

整型

整型总体上包括有符号型和无符号型,其中这两大类包括8、16、32、62、128和BigInt和还有bool。分别表示二进制位数。BigInt是高精度整型,他的数字表示范围无穷大。

类型带符号?比特数最小值最大值
Int88-2^72^7 - 1
UInt8 802^8 - 1
Int1616-2^152^15 - 1
UInt16 1602^16 - 1
Int3232-2^312^31 - 1
UInt32 3202^32 - 1
Int6464-2^632^63 - 1
UInt64 6402^64 - 1
Int128128-2^1272^127 - 1
UInt128 12802^128 - 1
BoolN/A8false (0)

true (1)

 

浮点类型

浮点型分为半精度Float16、单精度Float32和双精度Float64。

 

类型精度比特数
Float16half16
Float32single32
Float64double64

 


整数字面量以标准形式表示:

julia> 1
1

julia> 1234
1234

整型字面量的默认类型取决于目标系统是 32 位还是 64 位架构:

# 32 位系统:
julia> typeof(1)
Int32

# 64 位系统:
julia> typeof(1)
Int64
  • 十六进制数以0x开头
  • 八进制数以0b开头
  • 二进制数以0o开头
  • typemax和typemin函数分别用来返回某个类型的最大最小数

超出一个类型可表示的最大值会溢出。

julia> x = typemax(Int64)
9223372036854775807

julia> x + 1
-9223372036854775808

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

除法错误

有两种情况会产生除法错误:除以零和-1除以最小的负数,都会抛出一个DividError错误。

浮点数

浮点数字面量也使用标准格式表示,必要时可使用 E-表示法

julia> 1.0
1.0

julia> 1.
1.0

julia> 0.5
0.5

julia> .5
0.5

julia> -1.23
-1.23

julia> 1e10
1.0e10

julia> 2.5e-4
0.00025

上面的结果都是 Float64 值。使用 f 替代 e 可以得到 Float32 的字面量:

julia> 0.5f0
0.5f0

julia> typeof(ans)
Float32

julia> 2.5f-4
0.00025f0

数值容易就能转换成 Float32

julia> Float32(-1.5)
-1.5f0

julia> typeof(ans)
Float32

也存在十六进制的浮点数字面量,但只适用于 Float64 值。一般使用 p 前缀及以 2 为底的指数来表示:

julia> 0x1p0
1.0

julia> 0x1.8p3
12.0

julia> 0x.4p-1
0.125

julia> typeof(ans)
Float64

Julia 也支持半精度浮点数(Float16),但它们是使用 Float32 进行模拟实现的。

julia> sizeof(Float16(4.))
2

julia> 2*Float16(4.)
Float16(8.0)

下划线 _ 可用作数字分隔符:

julia> 10_000, 0.000_000_005, 0xdead_beef, 0b1011_0010
(10000, 5.0e-9, 0xdeadbeef, 0xb2)

浮点数中有两个零,0.0和-0.0,这两个零相等但是有着不同的二进制表示。

特殊的浮点数

有三种特定的标准浮点值不和实数轴上任何一点对应:

Float16Float32Float64名称描述
Inf16Inf32Inf正无穷一个大于所有有限浮点数的数
-Inf16-Inf32-Inf负无穷一个小于所有有限浮点数的数
NaN16NaN32NaN不是数(Not a Number)

一个不和任何浮点值(包括自己)相等(==)的值

机器精度

大多数实数在都无法用浮点数表示,因此两个可表示的浮点数的差值叫做机器精度。

Julia 提供了 eps 函数,它可以给出 1.0 与下一个 Julia 能表示的浮点数之间的差值。

julia> eps(Float32)
1.1920929f-7

julia> eps(Float64)
2.220446049250313e-16

julia> eps() # 与 eps(Float64) 相同
2.220446049250313e-16

eps 函数也可以接受一个浮点值作为参数,然后给出这个值与下一个可表示的值直接的绝对差。

julia> eps(1.0)
2.220446049250313e-16

julia> eps(1000.)
1.1368683772161603e-13

julia> eps(1e-27)
1.793662034335766e-43

julia> eps(0.0)
5.0e-324

Julia 也提供了 nextfloatprevfloat 两个函数分别返回基于参数的下一个更大或更小的可表示的浮点数:

julia> x = 1.25f0
1.25f0

julia> nextfloat(x)
1.2500001f0

julia> prevfloat(x)
1.2499999f0

julia> bitstring(prevfloat(x))
"00111111100111111111111111111111"

julia> bitstring(x)
"00111111101000000000000000000000"

julia> bitstring(nextfloat(x))
"00111111101000000000000000000001"

这个例子体现了一般原则,即相邻可表示的浮点数也有着相邻的二进制整数表示。

舍入模式

默认舍入到最接近的可表示的值。

任意精度算术

julia提供了BigInt、BigFloat用来表示任意精度的值,同时也可以用parse函数利用字符串构建任意精度的值。

julia> BigInt(typemax(Int64)) + 1
9223372036854775808

julia> parse(BigInt, "123456789012345678901234567890") + 1
123456789012345678901234567891

julia> parse(BigFloat, "1.23456789012345678901")
1.234567890123456789010000000000000000000000000000000000000000000000000000000004

julia> BigFloat(2.0^66) / 3
2.459565876494606882133333333333333333333333333333333333333333333333333333333344e+19

julia> factorial(BigInt(40))
815915283247897734345611269596115894272000000000

零和一的字面量(这里不是很理解)

Julia 提供了 0 和 1 的字面量函数,可以返回特定类型或所给变量的类型。

函数描述
zero(x)x 类型或变量 x 的类型的零字面量
one(x)x 类型或变量 x 的类型的一字面量

这些函数在数值比较中可以用来避免不必要的类型转换带来的开销。

例如:

julia> zero(Float32)
0.0f0

julia> zero(1.0)
0.0

julia> one(Int32)
1

julia> one(BigFloat)
1.0

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值