Python 两个浮点数之间的浮点数

Python 两个浮点数之间的浮点数,python,floating-point,ieee-754,Python,Floating Point,Ieee 754,假设我有两个Python浮点数a和b,有没有一种简单的方法可以找出IEEE-754表示法(或机器使用的任何表示法)中这两个浮点数之间有多少个可表示的实数?对于正数b>a>0,答案大约是: 尾数有52位(超过了隐含的1),乘以2,就得到了一个指数 因此,在[1:2]范围内有2**52个数字,正如在[1024:2048]范围内一样。我不知道您将使用它做什么-但是,如果两个浮点都有相同的指数,这应该是可能的。由于指数保持在高阶位上,因此加载浮点字节(本例中为8字节)作为一个整数,并从另一个整数中减去一

假设我有两个Python浮点数
a
b
,有没有一种简单的方法可以找出IEEE-754表示法(或机器使用的任何表示法)中这两个浮点数之间有多少个可表示的实数?

对于正数b>a>0,答案大约是:

尾数有52位(超过了隐含的1),乘以2,就得到了一个指数


因此,在[1:2]范围内有2**52个数字,正如在[1024:2048]范围内一样。我不知道您将使用它做什么-但是,如果两个浮点都有相同的指数,这应该是可能的。由于指数保持在高阶位上,因此加载浮点字节(本例中为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
>>>

好吧,IEEE754浮点有一个有趣的属性。如果你有浮点f,那么

(*(int*)&f + 1)
在某些条件下,是下一个可表示的浮点数。对于浮点a和b也是如此

*(int*)&a - *(int*)&b
将给出这些数字之间的浮点数


有关更多信息,请参阅。

我将查看数学模块中的frexp函数。下面的示例提取尾数并将其转换为整数。差值应为两个值之间的浮点数

>>> math.frexp(1.1234567890)[0] * 2**53
5059599576307254.0
>>> math.frexp(1.12345678901)[0] * 2**53
5059599576352290.0
应使用以下代码执行此操作:

import math
import sys

def delta(x,y):
    '''Return the number of floats between x and y.'''
    x = float(x)
    y = float(y)
    if x == y:
        return 0
    elif x < y:
        return -delta(y,x)
    else:
        x_mant, x_exp = math.frexp(x)
        y_mant, y_exp = math.frexp(y)
        x_int = int(x_mant * 2**(sys.float_info.mant_dig + x_exp - y_exp))
        y_int = int(y_mant * 2**sys.float_info.mant_dig)
        return x_int - y_int

print(delta(1.123456789, 1.1234567889999))
450
>>>
导入数学
导入系统
def增量(x,y):
''返回x和y之间的浮动数''
x=浮动(x)
y=浮动(y)
如果x==y:
返回0
elif x>>

出于好奇,您需要这些信息做什么?您的意思是什么?两个特定的浮点数还是一般的浮点数?您希望能够从python执行此操作,还是希望手动进行计算?我想比较两个浮点数,以确定它们是否等于接近但不等于pr的精度表示法的选择。我对在Python中实现这一点很感兴趣。请参阅处的AlmosteQual2SComplete函数-我知道我可以用(a-b)之类的方法实现这一点/aimport math import sys def delta(x,y): '''Return the number of floats between x and y.''' x = float(x) y = float(y) if x == y: return 0 elif x < y: return -delta(y,x) else: x_mant, x_exp = math.frexp(x) y_mant, y_exp = math.frexp(y) x_int = int(x_mant * 2**(sys.float_info.mant_dig + x_exp - y_exp)) y_int = int(y_mant * 2**sys.float_info.mant_dig) return x_int - y_int print(delta(1.123456789, 1.1234567889999)) 450 >>>