Python 两个浮点数之间的浮点数
假设我有两个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字节)作为一个整数,并从另一个整数中减去一
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
>>>