gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 06:44:01 24 4
gpt4 key购买 nike

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

julia> bits(1.0)
"0011111111110000000000000000000000000000000000000000000000000000"

然而,在使用这个函数时,我惊讶地发现 bits1.02.0 返回非常不同的位串:

julia> bits(1.0)
"0011111111110000000000000000000000000000000000000000000000000000"

julia> bits(2.0)
"0100000000000000000000000000000000000000000000000000000000000000"

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

这些位的含义是什么?我依稀记得一些关于对指数进行编码的位(来 self 的数值分析课),但我真的记不太清了,我没能记住在网上找到一个很好的描述...

最佳答案

要理解为什么 bits(1.0)bits(2.0)ASCIIString 值“如此不同”,您需要知道关于 IEEE-754 (binary) floating-point numbers 的一点(!) .每一个这样double-precision数字存储为 64 位字,分为三个部分:

  • 符号位(非负数为0,非正数为1),后跟
  • biased exponent (11 位),然后是
  • 有效数(52 位)。

normalized number 的值(如1.02.0)可以通过以下公式得到:

(-1)^sign_bit x 1.significand x 2^(biased_exponent - bias)

(对于 double float ,偏差值为 2^10 - 1 = 1023)

现在,

  • 1.0 = +1.000... x 2^(1023 - 偏差)

    而1023对应的是以2为底的(0)1111111111,所以对应的位串是

    0 01111111111 0000000000000000000000000000000000000000000000000000
  • 2.0 = +1.000... x 2^(1024 - 偏差)

    而1024对应的是2进制的10000000000,所以对应的位串是

    0 10000000000 0000000000000000000000000000000000000000000000000000
  • 3.0 = +1.100... x 2^(1024 - 偏差)

    所以对应的位串是

    0 10000000000 1000000000000000000000000000000000000000000000000000

等等

综上所述,2.0的位串可以通过自增1.0的位串中的biased-exponent部分得到,也就是2的幂,减去1. 增加这样一个数字会导致其二进制表示的所有位发生变化,就像增加数字 9999(十进制表示)会导致所有数字发生变化一样。

关于floating-point - 为什么代表 1.0 和 2.0 的位串如此不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32157869/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com