Python 浮点小数部分的前32位是什么?

Python 浮点小数部分的前32位是什么?,python,hash,bit-manipulation,Python,Hash,Bit Manipulation,我在维基百科上看到以下内容 具体来说,我将看以下部分 //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 >&

我在维基百科上看到以下内容

具体来说,我将看以下部分

//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位需要哪些步骤?请回答

多谢各位

  • 在Windows上使用计算器计算sqrt(2)(1.41421356237309500488016887242097)
  • 取小数部分(0.41421356237309500488016887242097)
  • 乘以2^32(1779033703.9520993849027770600526)
  • 用十六进制表示整个零件(6A09E667)

  • 瞧。(为没有回答Python问题向OP表示歉意,但我希望方法是明确的。)

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

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

    >>十六进制(int(math.modf(math.sqrt(2))[0]*(1Python可以将精确的IEEE 754浮点数据显示为十六进制值。它包括隐含的前导1、十六进制尾数和指数值:

    >>> math.sqrt(2).hex()
    '0x1.6a09e667f3bcdp+0'
    
    根据需要切片,例如:

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

    因此,因为Python将十六进制常量作为“半字节流”处理,而不是作为短、int、long(或其他任何形式),所以我不必担心字节顺序?这不会使Python文字十六进制常量有效地始终是大端的吗?如果这是一个愚蠢的问题,我表示歉意,但我很容易混淆。:)是的,但这并不是Python特有的。这只是我们写数字的顺序。请注意,这个顺序是从阿拉伯语书写中继承的,文本从右向左;从这个角度看,它是小尾端。但是,它没有划分为字节,所以字节交换是不相关的。好吧,这不是Python的答案,但它确实说明了我的问题对我来说,我看到我犯的错误是试图将小数部分乘以10^n,其中n是一个最大的n,其中(sqrt(2))*(10^n)的小数部分仍然可以包含在一个无符号的4字节整数中。然后,我获取该结果并进行转换(带地板)为了得到一个整数。哈哈,我太傻了。有趣的是,我不知道你可以用十六进制来表示一个浮点数。今天我们学到了很多。我们在这里还注意到它是一个截断值而不是一个舍入值。添加
    2**-33
    会将它舍入为0x6a09e668。