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

Ste*_*gle 7 python hash bit-manipulation

我在维基百科上看下面的SHA256伪代码.

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

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

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

>>> math.modf(math.sqrt(2))[0]
0.41421356237309515
Run Code Online (Sandbox Code Playgroud)

在文件的顶部,它声明所有常量的声明都是Big Endian.我知道我的环境是Small Endian,因为我打字.

>>> import sys
>>> sys.byteorder
'little'
Run Code Online (Sandbox Code Playgroud)

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

>>> int(0x67e6096a)
1743128938
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

Yan*_*ier 10

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

>>> hex(int(math.modf(math.sqrt(2))[0]*(1<<32)))
'0x6a09e667'
Run Code Online (Sandbox Code Playgroud)


Joh*_*ohn 6

  1. 在Windows上使用计算器计算sqrt(2)(1.4142135623730950488016887242097)
  2. 取小数部分(0.4142135623730950488016887242097)
  3. 乘以2 ^ 32(1779033703.9520993849027770600526)
  4. 以十六进制表示整个部分(6A09E667)

瞧.(对于不做Python回答的OP表示抱歉,但我希望方法很明确.)

  • 好的,这不是 python 答案,但它确实向我说明了我的问题。我看到我犯的错误是试图将小数部分乘以 10^n,其中 n 是一个整数,它是最大的 n,其中fractional_part_of(sqrt(2))*(10^n) 仍然可以包含在无符号 4 字节整数。然后我把这个结果和铸造(带地板)得到一个整数。哈哈,我太傻了。 (2认同)

Mar*_*nen 5

Python 可以将精确的 IEEE 754 浮点数据显示为十六进制值。它包括隐含的前导 1、十六进制尾数和指数值:

>>> math.sqrt(2).hex()
'0x1.6a09e667f3bcdp+0'
Run Code Online (Sandbox Code Playgroud)

根据需要切片,例如:

>>> '0x'+math.sqrt(2).hex().split('.')[1][:8]
'0x6a09e667'
Run Code Online (Sandbox Code Playgroud)