上QQ阅读APP看书,第一时间看更新
3.3.2 零的表达
浮点型在表达数值零时有些特别,存在正零和负零两种情况,它们的内存表达是不相同的,代码如下:
julia> bitstring(0.0) "0000000000000000000000000000000000000000000000000000000000000000" julia> bitstring(-0.0) "1000000000000000000000000000000000000000000000000000000000000000" julia> 0.0 == -0.0 # 比较运算符,后文会介绍 true # 返回布尔型true值,表示两者的值相同
可见,虽然都是零,但在二进制中最高位对应的符号位却是不同的。
虽然这两种零在一般的计算中表现常常一致,但在特殊的情况,也可能会导致不同的结果。为了避免这种差异,Julia提供了专门的函数用于生成某类型的零值,例如:
julia> zero(Float32) 0.0f0 julia> bitstring(ans) "00000000000000000000000000000000" julia> zero(Float64) 0.0 julia> bitstring(ans) "0000000000000000000000000000000000000000000000000000000000000000"
只要我们在需要使用零值时都采用该函数,就不会出现因为不一致而导致的无法预料的情况。
而且zero()函数除了按照指定类型生成相应的零值外,也可将某具体数值作为参数以生成其所属类型的零值,例如:
julia> zero(1.2) 0.0 julia> typeof(ans) Float64 julia> zero(Float16(12.98)) Float16(0.0)
显然,如果统一通过该函数生成浮点零值,就不会出现上述的内存表达差异,代码如下:
julia> zero(-0.0) 0.0 julia> bitstring(ans) "0000000000000000000000000000000000000000000000000000000000000000" julia> zero(0.0) 0.0 julia> bitstring(ans) "0000000000000000000000000000000000000000000000000000000000000000"
当然,函数zero()也适用于其他的数值类型,例如:
julia> zero(Bool) false julia> zero(UInt32) 0x00000000 julia> zero(1) 0 julia> zero(true) false
推而广之,除了零之外,数值1也是特别常用的值。Julia提供了专门的函数one()用于生成各种类型的1值,例如:
julia> one(Int64) 1 julia> one(38) 1 julia> one(Float32) 1.0f0 julia> one(Bool) true
这种统一操作不但在接口上更为方便,而且恰当使用时能够给性能带来很大的好处。这是非常值得我们学习的编程经验。