Sujet : Re: Affichage en notation scientifique.
De : alain (at) *nospam* universite-de-strasbourg.fr.invalid (Alain Ketterlin)
Groupes : fr.comp.lang.pythonDate : 14. Sep 2022, 17:59:21
Autres entêtes
Organisation : Université de Strasbourg
Message-ID : <875yhpyjrq.fsf@universite-de-strasbourg.fr.invalid>
References : 1 2 3 4 5
User-Agent : Gnus/5.13 (Gnus v5.13) Emacs/25.2 (gnu/linux)
ram@zedat.fu-berlin.de (Stefan Ram) writes:
[...]
Oui, mais cette approche pourrait entraîner quelques
irrégularités (comme d'autres approches peut-être).
Cela n'est pas lié spécialement à log10, c'est tout simplement la
représentation des flottants qui a une précision limitée (j'utilise des
chaînes seulement pour comparer à ton code) :
float ( int ('9'*15) )
999999999999999.0
float ( int ('9'*16) )
1e+16
(et effectivement le module decimal permet d'étendre cette précision,
mais elle restera toujours finie).
Tu peux utiliser des entiers (ou même des chaînes de caractères pour une
raison qui m'échappe) si tu veux, mais log10 () va convertir son
argument en flottant avant de calculer quoi que ce soit, ce qui aggrave
les risque d'imprécision.
from math import log10
>
num = ''
for i in range( 16 ):
num += '9'
e = int( log10( int( num )))
print( i, e, num, int( num ), log10( int( num )))
int (... un flottant ...) arrondit vers zéro. Il vaut mieux utiliser
math.floor() pour les petits nombres.
Note que pour i tu traites le nombre (10*(i+2)) - 1 (ou '9'*(i+1)).
[...]
13 13 99999999999999 99999999999999 13.999999999999996
14 15 999999999999999 999999999999999 15.0
15 16 9999999999999999 9999999999999999 16.0
for i in [14, 15, 16]:
print (float (int ('9'*i)),
math.log10 (float (int ('9'*i))))
affiche
99999999999999.0 13.999999999999996
999999999999999.0 15.0
1e+16 16.0
donc : pour 14 tout est (à peu près) ok, pour 15 c'est log10 qui
arrondit, pour 16, c'est la conversion en entier qui arrondit.
-- Alain.