2011-01-12 134 views
5

我正在看维基百科上的以下SHA256 pseudocode该浮点数的小数部分的前32位是什么?

具体来说,我正在看下面的部分。

//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(float)结果可以转换为1743128938(int),但我真的不知道如何。获得浮点数的小数部分的前32位需要执行哪些步骤? Python只回答请。

谢谢。

回答

8

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

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

因此,因为Python将十六进制常量处理为“半字节流”而不是短,int,long(或其他),所以我不必担心字节顺序?难道这不会使Python常量有效地总是Big Endian吗?如果一个愚蠢的问题道歉,但我很容易混淆。 :) – 2011-01-12 23:59:02

+0

是的排序,但这不是Python特定的。这只是我们写数字的顺序。请注意,此订单是从阿拉伯文书写继承的,文字从右向左;有了这个观点,这是小端。然而,它没有被分成字节,所以字节交换是不相关的。 – 2011-01-13 00:25:25

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

Voila。 (对OP没有做Python回答的道歉,但我希望方法清楚。)

+0

好吧,它不是一个Python回答,但它确实说明了我的问题。我看到我犯的错误是试图将小数部分乘以10^n,其中n是最大的整数,其中fractional_part_of(sqrt(2))*(10^n)仍然可以包含在无符号4字节整数。然后我得到了这个结果,然后铸造(用地板)得到一个整数。哈哈,我很傻。 – 2011-01-13 00:06:41

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

切片根据需要,例如:

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