两个浮点数之间的浮点数

ast*_*rog 10 python floating-point ieee-754

说我有两个Python花车ab,有一种简单的方法来找出多少表现的实数是IEEE-754表示两个(或任何代表使用的机器使用)之间?

Mat*_*gro 12

AFAIK,IEEE754浮标有一个有趣的属性.如果你有浮动f,那么

(*(int*)&f + 1)
Run Code Online (Sandbox Code Playgroud)

在某些条件下,是下一个可表示的浮点数.因此对于花车a和b

*(int*)&a - *(int*)&b
Run Code Online (Sandbox Code Playgroud)

将为您提供这些数字之间的浮点数.

有关更多信息,请参见http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm.

  • 唯一的要求是它们具有相同的符号,也不是Nan或inf. (6认同)

jsb*_*eno 10

我不知道你将使用它 - 但是,如果两个浮点数具有相同的指数,它应该是可能的.由于指数保持在高位上,因此将浮点字节(在本例中为8个字节)作为整数加载并从另一个中减去一个应该得到您想要的数字.我使用struct模型将浮点数打包为二进制表示,然后将它们解压缩为(C,8字节)长整数:

>>> import struct
>>> a = struct.pack("dd", 1.000000,1.000001)
>>> b = struct.unpack("ll",a)
>>> b[1] - b[0]
4503599627
>>> a = struct.pack("dd", 1.000000000,1.000000001)
>>> b = struct.unpack("ll",a)
>>> b[1] - b[0]
4503600
>>>
Run Code Online (Sandbox Code Playgroud)

  • +1; 很好的答案.但是,它不适用于32位C长的系统.为了安全起见,使用"<dd"代替"dd"和"<qq"而不是"ll"; "<"强制struct模块使用标准大小而不是本机大小.(对于本机大小,"l"在32位操作系统和32位*或*64位Windows上为4个字节,在典型的64位非Windows操作系统上为8个字节.) (3认同)