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), ...