这个浮点数的小数部分的前32位是什么?
我在看维基百科上的一段关于 SHA256的伪代码。
具体来说,我关注的是下面这一部分。
//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的交互式环境中输入的。
>>> math.modf(math.sqrt(2))[0]
0.41421356237309515
在文件的顶部说明所有常量的声明是大端格式。我知道我的环境是小端格式,因为我输入了。
>>> import sys
>>> sys.byteorder
'little'
所以,根据我对h0的十六进制值的手动操作,小端格式的表示应该是0x67e6096a。
>>> int(0x67e6096a)
1743128938
但是我卡住了。我尝试了各种操作,但都没有得到这个结果。我不知道怎么获取浮点数的小数部分的前32位。我知道我的0.41421356237309515(浮点数)结果可以转换成1743128938(整数),但我真的不知道怎么做。获取浮点数的小数部分的前32位需要哪些步骤?请只给出Python的解答。
谢谢。
3 个回答
6
Python可以把IEEE 754浮点数的数据以十六进制的形式显示出来。这种表示法包括了隐含的前导1、以十六进制表示的尾数和指数值:
>>> math.sqrt(2).hex()
'0x1.6a09e667f3bcdp+0'
你可以根据需要进行切片,比如:
>>> '0x'+math.sqrt(2).hex().split('.')[1][:8]
'0x6a09e667'
18
- 在Windows上用计算器计算平方根2,也就是sqrt(2),结果是1.4142135623730950488016887242097。
- 取这个结果的小数部分,也就是0.4142135623730950488016887242097。
- 把这个小数部分乘以2的32次方,结果是1779033703.9520993849027770600526。
- 把这个结果的整数部分转换成十六进制,得到6A09E667。
好了。 (对原作者表示歉意,没有用Python来回答,但希望这个方法能让你明白。)
14
字节序对十六进制常量来说并不重要;每个数字都是一个半字节,最不重要的半字节在最后。如果你处理的是不同大小的指针,那就要注意字节序了。如果你需要使用字节顺序,结构体模块可以帮你。无论如何,你已经成功获取了小数部分;将其转换为十六进制很简单,只需乘以一个数然后截断,就能得到一个整数:
>>> hex(int(math.modf(math.sqrt(2))[0]*(1<<32)))
'0x6a09e667'