这个浮点数的小数部分的前32位是多少?

时间:2011-01-12 22:52:47

标签: python hash bit-manipulation

我在维基百科上查看以下SHA256 pseudocode

具体来说,我正在查看以下部分。

//Initialize variables
//(first 32 bits of the fractional parts of the square roots of the first 8 primes 2..19):
h0 := 0x6a09e667

我想弄清楚h0是如何生成的。我从评论中知道这应该是2的平方根的小数部分。我相信通过键入以下内容我可以得到2的平方根的小数部分。以下所有代码均来自python repl。

>>> math.modf(math.sqrt(2))[0]
0.41421356237309515

在文件的顶部,它声明所有常量的声明都是Big Endian。我知道我的环境是Small Endian,因为我输入了。

>>> import sys
>>> sys.byteorder
'little'

所以,根据我对h0中十六进制值的手动操作,Little Endian表示应为0x67e6096a。

>>> int(0x67e6096a)
1743128938

我被困住了。我尝试过各种各样的操作,但是没有这些操作最终得到了这个结果。我不知道如何获得浮点数的小数部分的前32位。我知道不知怎的,我的0.41421356237309515(浮点)结果可以转换成1743128938(int),但我真的不知道怎么做。获取浮点数的小数部分的前32位所需的步骤是什么? Python只回答。

谢谢。

3 个答案:

答案 0 :(得分:9)

字节顺序对十六进制常数无关紧要;每个数字都是半字节,最低有效半字节为最后一个。如果你处理不同大小的指针,这很重要。如果确实需要使用字节顺序,那么struct模块可以提供帮助。无论如何,你已经很好地检索了小数部分;通过简单地相乘和截断,可以轻松地将其转换为十六进制,因此我们得到一个整数:

>>> hex(int(math.modf(math.sqrt(2))[0]*(1<<32)))
'0x6a09e667'

答案 1 :(得分:6)

  1. 在Windows上使用计算器计算sqrt(2)(1.4142135623730950488016887242097)
  2. 取小数部分(0.4142135623730950488016887242097)
  3. 乘以2 ^ 32(1779033703.9520993849027770600526)
  4. 以十六进制表示整个部分(6A09E667)
  5. 瞧。 (对于没有做Python回答而对OP表示抱歉,但我希望这个方法很明确。)

答案 2 :(得分:3)

>>> math.sqrt(2).hex()
'0x1.6a09e667f3bcdp+0'

根据需要切片,例如:

>>> '0x'+math.sqrt(2).hex().split('.')[1][:8]
'0x6a09e667'