import numpy
import math
x = numpy.roots([2,-2,(21 - 21**2)])
print x[0], math.floor(x[0])
输出结果为:
15.0 14.0
我希望
15.0 15.0
我认为没有任何理由让发言权等于14.0。请解释一下!
答案 0 :(得分:2)
似乎x[0]
略小于15,因此floor
将值降低到14.根寻找算法是数字而不是符号,浮点运算不精确。
答案 1 :(得分:2)
浮点数只是某些值的近似值,并且所有计算都可能引入舍入错误。打印浮点数也可能会将数字四舍五入到更少的数字。尝试
print repr(x[0]), repr(math.floor(x[0]))
确保显示所有数字。我想它会显示类似14.9999999999999
的内容。
答案 2 :(得分:2)
我之前使用过一个名为fAlmostEqual
的函数,基于numpy的allclose函数:
import math
def fAlmostEqual(a, b, rtol=1.0000000000000001e-05, atol=1e-08):
"""Checks if the given floats are almost equal. Uses the algorithm
from numpy.allclose."""
return math.fabs(a - b) <= (atol + rtol * math.fabs(b))
基于此创建模糊楼层功能:
def fuzzyFloor(v):
"""Returns the floor of the given number, unless it is equal to its
ceiling (within floating point error)."""
floor = math.floor(v)
if fAlmostEqual(floor+1, v):
return floor+1
return floor
print fuzzyFloor(14.9999999999999)
print fuzzyFloor(15)
print fuzzyFloor(14.99)
print fuzzyFloor(14.5)
打印:
15.0
15.0
14.0
14.0
答案 3 :(得分:0)
你的代码对我没有同样的意思:
>>> import numpy
>>> import math
>>>
>>> x = numpy.roots([2,-2,(21 - 21**2)])
>>> print x[0], math.floor(x[0])
15.0 15.0
然而,这里潜伏着14个人。这是其中一个根源:
>>> print x
[ 15. -14.]