为什么代表1.0和2.0的位串如此不同?

San*_*esí 2 floating-point ieee-754 julia

我最近开始使用Julia,我发现了bits函数,它返回其数字参数的位串表示.例如:

julia> bits(1.0)
"0011111111110000000000000000000000000000000000000000000000000000"
Run Code Online (Sandbox Code Playgroud)

但是,在使用此功能时,我惊讶地发现bits返回非常不同的位串1.02.0:

julia> bits(1.0)
"0011111111110000000000000000000000000000000000000000000000000000"

julia> bits(2.0)
"0100000000000000000000000000000000000000000000000000000000000000"
Run Code Online (Sandbox Code Playgroud)

我原以为这两个值是相似的......

那些位是什么意思?我含糊地回忆起有关编码指数的比特(来自我的数值分析类),但我真的不记得了,我没有设法在网上找到一个好的描述......

jub*_*0bs 12

要理解为什么ASCIIStringbits(1.0)bits(2.0)"如此不同"的原因,你需要知道关于IEEE-754(二进制)浮点数的一点(!).每个这样的双精度数字都存储为64位字,分为三个部分:

  • 符号位(0表示非负数,1表示非正数),后跟
  • 偏置指数(11位),接着
  • 有效数(52位).

可以使用以下公式获得标准化数字(例如1.02.0)的值:

(-1)^sign_bit x 1.significand x 2^(biased_exponent - bias)
Run Code Online (Sandbox Code Playgroud)

(对于双精度浮点数,偏差值为2 ^ 10 - 1 = 1023)

现在,

等等

总之,您可以2.0通过递增位串中的偏置指数部分来获得位串1.0,该位是2的幂,减去1.递增这样的数字会导致其二进制表示的所有位发生变化,增加数字9999(以十进制表示)的相同方式会导致所有数字发生变化.