n! négatif avec python
Bonjour à tous,
Pour comparer les temps d'exécution de deux petits programmes calculant $n!$, j'ai assez naturellement tapé un petit code en python (voir la pièce jointe).
A partir de 20!, on me renvoie des nombres négatifs! Quelqu'un a une explication? Si ça peut aider j'ai fait ça dans un jupyter notebook avec python 3.
Pour comparer les temps d'exécution de deux petits programmes calculant $n!$, j'ai assez naturellement tapé un petit code en python (voir la pièce jointe).
A partir de 20!, on me renvoie des nombres négatifs! Quelqu'un a une explication? Si ça peut aider j'ai fait ça dans un jupyter notebook avec python 3.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
-- Schnoebelen, Philippe
-- Schnoebelen, Philippe
Je viens de regarder, np.prod(range(1,6)) fabrique un int64.
En tout cas j'apprends des trucs grâce à ce souci. Merci encore !
-- Schnoebelen, Philippe
Dans l'autre fil, tu donnes cette variante :
En plus de se comporter de façon erratique sur certaines entrées (que renvoie ton prod(["1+2", 2]) ?), eval est une fonction hyper dangereuse dans la vraie vie, ouvrant la porte en grand aux injections de code.
Par exemple, quel serait l'effet de : ... Hum ??
Si on veut à tout prix un one-liner, la solution de Pascal est la bonne.
Et les injections de code… certes mais qui va utiliser un tel code dans un endroit où c’est dangereux de le faire ?
-- Schnoebelen, Philippe
Tu parles du tien ou de mon exemple "à ne surtout pas faire". Car le mien, ok aucun développeur même débile ne mettrait ça dans son code. Mais si un développeur un peu neuneu prend ta fonction, la fout sur son serveur et propose comme service de calculer des produits de liste, un attaquant pourrait alors proposer de calculer le produit de :
Et badaboum.... Donc non, eval n'est pas une solution pour faire un produit.
La solution (que j’ai d’ailleurs attrapée sur ce forum) sert pour calculer un produit d’entiers ; c’était la question initiale, non ?
Cela dit, la meilleure solution est d’utiliser factorial importé parce que plus rapide et testée par les développeurs de Python.
-- Schnoebelen, Philippe
J’ai l’impression d’entendre un prof qui interdit a priori d’utiliser goto, break, continue ou return en milieu de fonction parce que tel livre d’un ponte qu’ils ont feuilleté a dit que c’était mal et que ça tuait des chatons.
-- Schnoebelen, Philippe
Même sans utiliser "reduce", on peut très simplement et proprement écrire cette fonction "prod" avec une simple boucle sans utiliser "eval". Le forum est aussi lu par des étudiants, il me semble dommageable de leur proposer des solutions dégueu.
-- Schnoebelen, Philippe
-- Schnoebelen, Philippe
Après eval a ses usages, il suffit de faire une recherche dans le code source de CPython, numpy, ntkl, sympy et sans doute beaucoup d'autres.
Dans le livre de Swinnen il y a une utilisation d' eval dans le contexte de réaliser en Tkinter une "calculatrice" ce qui évite à l'apprenti programmeur d'avoir à écrire un parseur d'expressions arithmétiques.
Pour le C, pas de fonction standard eval peut-être en C interprété.