2017-07-15 3 views
1

La question est dans le titre, par exemple ce que je suis inquiet au sujet est:La fonction math.ceil de Python peut-elle être trompée par une erreur de représentation en virgule flottante?

Si je calcule math.ceil(math.log(4,2)), dois-je le risque de 3 au lieu de 2 parce que le journal retourne 2,0000000000000343 au lieu de 2.0?

Je ne le soupçonne pas mais je n'ai pas trouvé quelque chose pour le confirmer!

+1

Vous voudrez peut-être regarder 'int.bit_length()': pour un entier positif 'n',' Math.ceil (mathématiques. log (n, 2)) 'est calculé plus sûrement comme' (n-1) .bit_length() '. Notez également que les versions récentes de Python ont 'math.log2', ce qui est un peu plus précis que' math.log (..., 2) '. –

Répondre

2

Oui. Vous pouvez simplement calculer math.ceil(math.log(x**y,x)) pour beaucoup (x,y) paires jusqu'à ce qu'il soit pas égal à 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 

Pour éviter ce problème, vous pouvez simplement utiliser round() au lieu de math.ceil.

(2,29) est juste la première paire de beaucoup les problématiques:

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