python的math.ceil函数是否会因浮点表示错误而被欺骗?

时间:2017-07-15 12:04:40

标签: python floating-point ceil

问题出在标题中,例如我担心的是:

如果我计算math.ceil(math.log(4,2)),我是否有可能获得3而不是2,因为日志将返回2.0000000000000343而不是2.0?

我怀疑没有,但我还没找到确认的东西!

1 个答案:

答案 0 :(得分:2)

是。您可以为许多math.ceil(math.log(x**y,x))对计算(x,y),直到它不等于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), ...