-
22-09-2019 - |
题
我偶然发现了一个非常奇怪的错误。阅读代码中的注释以了解错误到底是什么,但本质上是变量模 1 返回 1(但它不等于 1!)。我假设存在显示问题,其中浮点数非常接近 1,但不完全一样。但是,它应该模为零。我无法轻松测试这种情况,因为 (last % 1) != 1.0 !当我尝试将相同的数字插入另一个 python 终端时,一切都正常。这是怎么回事?
def r(k,i,p):
first = i*p
last = first + p
steps = int((i+1)*p) - int(i*p)
if steps < 1:
return p
elif steps >= 1:
if k == 0:
return 1 - (first % 1)
elif k == steps:
if i == 189:
print last, 1, type(last), last % 1, last - int(last)
# Prints: 73.0 1 <type 'float'> 1.0 1.0
print last % 1 == 1 # Returns False
if last % 1 == 1.0:
return 0
return (last % 1)
else:
return 1
解决方案
欢迎到IEEE754,享受您的逗留。
其他提示
打印不显示号码的全精度的存储,您可以使用repr()
做到这一点。
>>> last=72.99999999999999
>>> print last, 1, type(last), last % 1, last - int(last)
73.0 1 <type 'float'> 1.0 1.0
>>> print last % 1 == 1
False
>>> print repr(last), 1, type(last), repr(last%1), repr(last - int(last))
72.999999999999986 1 <type 'float'> 0.99999999999998579 0.99999999999998579
>>>
您应该使用math.fmod(X,Y)。下面是从 http://docs.python.org/library/math.html:
“。注意,Python的表达式x%y可以不返回相同的结果的目的C标准的是,FMOD(X,Y)是完全(数学上;以无限精度)等于X - N * y的一些整数n,使得结果具有相同的符号为x和幅度小于ABS(Y)。Python的X%Y的回报,其中y代替的符号的结果,并且可能不适用于浮动参数准确可计算。例如,FMOD (-1e-100,1e100)是-1e-100,但Python的-1e-100%1e100结果是1e100-1e-100,这是不能被精确地表示为浮点数,和轮令人惊奇1e100 即可。由于这个原因,功能FMOD()通常与浮子工作时,同时与整体工作时,优选Python的X%Y优选的“。
您可以尝试 math.fmod 的函数,而不是last % 1
,也许它更适合于你的问题。
或者你可以重新制定你的问题在整数空间。
无论如何,这不是好的做法使用平等==
操作,由于即使从像0.1 + 0.2 == 0.3
seemigly琐碎操作不精确的结果进行比较的浮点值