Aujourd'hui, j'ai utilisé la fonction math.log() pour obtenir le logarithme de 4913 à la base 17. La réponse est 3, mais lorsque j'ai exécuté le code ci-dessous, j'ai obtenu 2,9999999999999996.

1) Est-ce parce que le calcul de math.log(x, b) est log(x) / log(b)?

2) Existe-t-il une solution pour obtenir la bonne réponse 3?

import math
print(math.log(4913,17))
5
Saisiot 18 mars 2019 à 16:24

2 réponses

Meilleure réponse
  1. Oui, la documentation le dit explicitement.
  2. Une autre solution consiste à utiliser la classe Decimal, issue de la bibliothèque "decimal":

    import math
    from decimal import Decimal, getcontext
    getcontext().prec = 6
    Decimal(math.log(4913))/Decimal(math.log(17))
    
2
Itamar Mushkin 18 mars 2019 à 13:39

Vous pouvez utiliser la bibliothèque gmpy2 :

import gmpy2

print(gmpy2.iroot(4913, 3))
# (mpz(17), True)

print(gmpy2.iroot(4913 + 1, 3))
# (mpz(17), False)

Qui vous indique le résultat et s'il est exact ou non.

Consultez également Précision de journal en python et Les mathématiques à virgule flottante sont-elles cassées ?.

3
hiro protagonist 18 mars 2019 à 15:58