python 的 math.ceil 函数是否会因浮点表示错误而被欺骗?
Can python's math.ceil function get tricked from floating point representation error?
问题在标题里,比如我担心的是:
如果我计算 math.ceil(math.log(4,2))
,我是否有得到 3 而不是 2 的风险,因为日志将 return 2.0000000000000343 而不是 2.0?
我怀疑不是,但我还没有找到可以证实的东西!
是的。您可以简单地计算许多 (x,y)
对的 math.ceil(math.log(x**y,x))
直到它不等于 y
:
>>> next((x,y) for x in range(2,100) for y in range(2,100) if y != math.ceil(math.log(x**y,x)))
(2, 29)
>>> '%.30f' % math.log(2**29,2)
'29.000000000000003552713678800501'
>>> math.ceil(math.log(2**29,2))
30.0
为避免此问题,您可以简单地使用 round()
而不是 math.ceil
。
(2,29)
只是许多问题中的第一对:
[(2, 29), (2, 31), (2, 39), (2, 47), (2, 51), (2, 55), (2, 58), (2, 59), (2, 62), (2, 93), (4, 29), (4, 31), (4, 93), (5, 3), (5, 6), (5, 12), (5, 13), (5, 17), (5, 21), ...
问题在标题里,比如我担心的是:
如果我计算 math.ceil(math.log(4,2))
,我是否有得到 3 而不是 2 的风险,因为日志将 return 2.0000000000000343 而不是 2.0?
我怀疑不是,但我还没有找到可以证实的东西!
是的。您可以简单地计算许多 (x,y)
对的 math.ceil(math.log(x**y,x))
直到它不等于 y
:
>>> next((x,y) for x in range(2,100) for y in range(2,100) if y != math.ceil(math.log(x**y,x)))
(2, 29)
>>> '%.30f' % math.log(2**29,2)
'29.000000000000003552713678800501'
>>> math.ceil(math.log(2**29,2))
30.0
为避免此问题,您可以简单地使用 round()
而不是 math.ceil
。
(2,29)
只是许多问题中的第一对:
[(2, 29), (2, 31), (2, 39), (2, 47), (2, 51), (2, 55), (2, 58), (2, 59), (2, 62), (2, 93), (4, 29), (4, 31), (4, 93), (5, 3), (5, 6), (5, 12), (5, 13), (5, 17), (5, 21), ...