这个问题与another question相似,但是我看不出如何以简单的方式将答案扩展到该问题。
在这里,我想根据double
中给定的double
计算第n个Python
。
该函数采用整数n
,双精度x
,并输出一个double
,该n-th
是x
之后的n
(如果为负,则为)。有有效的方法吗?
具体来说,令nth_fp_after为函数,则nth_fp_after(x,n)应等于nextafter(在C中)对x的应用的n倍; nth_fp_after(x,0)应该为'x',依此类推。
最佳答案
answer of the question you pointed to正是您问题的答案。答案解决了64位浮点数的问题,这是python等效的C double。
好吧,如果您添加以下内容struct.unpack('!i',struct.pack('!f',x))[0]
n
并使用它来调用其他答案的功能,则应获取它。
通过修改的完整解决方案如下所示:
import struct
def nth_fp(n, x=0.0):
if(x>=0):
m = n + struct.unpack('!Q',struct.pack('!d',x))[0]
else:
m = n - struct.unpack('!Q',struct.pack('!d',abs(x) ))[0]
if m < 0:
sign_bit = 0x8000000000000000
m = -m
else:
sign_bit = 0
if m >= 0x7ff0000000000000:
raise ValueError('out of range')
bit_pattern = struct.pack('Q', m | sign_bit)
return struct.unpack('d', bit_pattern)[0]
我在第二个参数中添加了默认值,以便您可以在两种情况下都使用它,带有或不带有偏移量
x
。