[python]Avoir des "float" plus longs
Résolu/Fermé
teebo
Messages postés
33491
Date d'inscription
jeudi 14 octobre 2004
Statut
Modérateur
Dernière intervention
24 février 2011
-
8 janv. 2009 à 11:39
Fanelga Messages postés 27 Date d'inscription vendredi 6 juin 2014 Statut Membre Dernière intervention 29 avril 2015 - 29 avril 2015 à 11:39
Fanelga Messages postés 27 Date d'inscription vendredi 6 juin 2014 Statut Membre Dernière intervention 29 avril 2015 - 29 avril 2015 à 11:39
A voir également:
- [python]Avoir des "float" plus longs
- Citizen code python avis - Accueil - Outils
- Python est introuvable. exúcutez sans argument pour procúder ó l ✓ - Forum Python
- [PyCharm] Pas d'interpréteur python ✓ - Forum Python
- Le mot le plus long jeu gratuit - Télécharger - Outils professionnels
5 réponses
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
8 janv. 2009 à 15:30
8 janv. 2009 à 15:30
Peut être regarder du côté de Numpy:
http://numpy.scipy.org//
Mais je connais pas du tout, c'est juste qu'il y a des types de données particuliers dedans pour des applications scientifiques....
http://numpy.scipy.org//
Mais je connais pas du tout, c'est juste qu'il y a des types de données particuliers dedans pour des applications scientifiques....
teebo
Messages postés
33491
Date d'inscription
jeudi 14 octobre 2004
Statut
Modérateur
Dernière intervention
24 février 2011
1 793
8 janv. 2009 à 16:02
8 janv. 2009 à 16:02
Merci,
Je viens de regarder, et en fait non il est pas capable de me donner mieux...
Je viens de regarder, et en fait non il est pas capable de me donner mieux...
teebo
Messages postés
33491
Date d'inscription
jeudi 14 octobre 2004
Statut
Modérateur
Dernière intervention
24 février 2011
1 793
8 janv. 2009 à 16:22
8 janv. 2009 à 16:22
Bon j'ai trafiqué autrement, ce site http://pagesperso-orange.fr/jean-paul.davalan/arit/per/fractions.html?t=1%2F101 m'a bien aidé pour comprendre les mécanismes, et avec quelques test sur leur algo j'ai trouvé ma réponse
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
8 janv. 2009 à 16:23
8 janv. 2009 à 16:23
Ah ok...
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
8 janv. 2009 à 16:22
8 janv. 2009 à 16:22
Et euh... c'est pas possible d'émuler avec des entiers par hazard?
Parce que python supporte des nombres entiers extraordinairement grands....
Après je te dis ça, je suis une quiche en math hein? Mais je suppose que c'est possible.
Parce que python supporte des nombres entiers extraordinairement grands....
Après je te dis ça, je suis une quiche en math hein? Mais je suppose que c'est possible.
teebo
Messages postés
33491
Date d'inscription
jeudi 14 octobre 2004
Statut
Modérateur
Dernière intervention
24 février 2011
1 793
8 janv. 2009 à 16:23
8 janv. 2009 à 16:23
Non ça marchait pas non plus parce que il faisait son arrondi avant, j'arrivais pas à le faire mieux, j'ai pas compris pourquoi non plus...
Psych0
>
teebo
Messages postés
33491
Date d'inscription
jeudi 14 octobre 2004
Statut
Modérateur
Dernière intervention
24 février 2011
1 mars 2010 à 17:47
1 mars 2010 à 17:47
Salut teebo,
Je voulais juste savoir si tu pouvais me fournir ton script (python) seulement pour les floats "courts" (celui que tu avais reussi à faire avant de poster sur le forum). Cela me serait d'une grande utilité.
Cordialement
Je voulais juste savoir si tu pouvais me fournir ton script (python) seulement pour les floats "courts" (celui que tu avais reussi à faire avant de poster sur le forum). Cela me serait d'une grande utilité.
Cordialement
teebo
Messages postés
33491
Date d'inscription
jeudi 14 octobre 2004
Statut
Modérateur
Dernière intervention
24 février 2011
1 793
>
Psych0
3 mars 2010 à 12:34
3 mars 2010 à 12:34
Salu
Désolé, je viens de regarder mais j'ai viré le problème 26 de mon script...
Tu veux faire quoi exactement?
Désolé, je viens de regarder mais j'ai viré le problème 26 de mon script...
Tu veux faire quoi exactement?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Melnofil
Messages postés
3
Date d'inscription
samedi 16 août 2008
Statut
Membre
Dernière intervention
20 avril 2015
2
Modifié par Melnofil le 31/03/2010 à 16:37
Modifié par Melnofil le 31/03/2010 à 16:37
Sinon, je te propose une technique de résolution utilisant les entiers long au lieu des nombres flottant :
>>> (10**1) % 7
3
>>> (10**2) % 7
2
>>> (10**3) % 7
6
>>> (10**4) % 7
4
>>> (10**5) % 7
5
>>> (10**6) % 7
1
# Le résultat est égal au numérateur (de la fraction 1 / 7), ce qui permet de déduire que cette fraction est périodique sur 6 chiffres et que l'on peut retrouver ainsi :
>>> (10**6 - 1) / 7
142857
D'où : 1/7 = 0.(142857)
>>> (10**1) % 8
2
>>> (10**2) % 8
4
>>> (10**3) % 8
0
# Le résultat de zéro nous permet de déduire que la fraction (1 / 8) n'est pas périodique et qu'il y a 3 chiffres après la virgule que l'on peut retrouver ainsi :
>>> 10**3 / 8
125
D'où 1/8 = 0.125
Je te laisse réfléchir au pourquoi et comment cette astuce fonctionne, ainsi qu'a l'algorithme implémentant cette solution sans utiliser les nombres flottants ;-)
ÉDIT : J'ai testé mon algorithme, le code tient en 24 lignes simples (comprendre : sans tricher en cumulant des lignes entre elles ;-) et sachant que je n'ai cherché à optimiser le code). Le site Euler m'a annoncé que j'ai trouvé la bonne solution (du premier coup, hourra !).
Je rajoute au passage le cas qui m'a paru le plus retords dans les premiers nombres... le 28 (si vous comprenez celui-là, tous les autres cas seront triviaux) :
>>> (10**1)%28
10
>>> (10**2)%28
16
>>> (10**3)%28
20
>>> (10**4)%28
4
>>> (10**5)%28
12
>>> (10**6)%28
8
>>> (10**7)%28
24
>>> (10**8)%28
16
# On stoppe ici, car le résultat 16 a déjà été obtenu en position 2, j'en déduis que la fraction (1/28) est périodique à partir de 8 chiffres après la virgule, mais que les 2 premiers chiffres ne font pas parti de la récursion. Donc 8-2=6 chiffres font parti de la récursion. Les chiffres peuvent être obtenus ainsi :
>>> 10**8 / 28
3571428
# Remarquez l'ajout d'un zéro initial, car je dois obtenir 8 chiffres et pas 7 !
D'où 1/28 = 0.03(571428)
Par ailleurs, pour ceux qui utilisent un autre langage de programmation ne possédant pas les entiers "illimités", sachez qu'il est possible de calculer les opérations "(10**X)%Y" sans dépasser 31bits.
>>> (10**1) % 7
3
>>> (10**2) % 7
2
>>> (10**3) % 7
6
>>> (10**4) % 7
4
>>> (10**5) % 7
5
>>> (10**6) % 7
1
# Le résultat est égal au numérateur (de la fraction 1 / 7), ce qui permet de déduire que cette fraction est périodique sur 6 chiffres et que l'on peut retrouver ainsi :
>>> (10**6 - 1) / 7
142857
D'où : 1/7 = 0.(142857)
>>> (10**1) % 8
2
>>> (10**2) % 8
4
>>> (10**3) % 8
0
# Le résultat de zéro nous permet de déduire que la fraction (1 / 8) n'est pas périodique et qu'il y a 3 chiffres après la virgule que l'on peut retrouver ainsi :
>>> 10**3 / 8
125
D'où 1/8 = 0.125
Je te laisse réfléchir au pourquoi et comment cette astuce fonctionne, ainsi qu'a l'algorithme implémentant cette solution sans utiliser les nombres flottants ;-)
ÉDIT : J'ai testé mon algorithme, le code tient en 24 lignes simples (comprendre : sans tricher en cumulant des lignes entre elles ;-) et sachant que je n'ai cherché à optimiser le code). Le site Euler m'a annoncé que j'ai trouvé la bonne solution (du premier coup, hourra !).
Je rajoute au passage le cas qui m'a paru le plus retords dans les premiers nombres... le 28 (si vous comprenez celui-là, tous les autres cas seront triviaux) :
>>> (10**1)%28
10
>>> (10**2)%28
16
>>> (10**3)%28
20
>>> (10**4)%28
4
>>> (10**5)%28
12
>>> (10**6)%28
8
>>> (10**7)%28
24
>>> (10**8)%28
16
# On stoppe ici, car le résultat 16 a déjà été obtenu en position 2, j'en déduis que la fraction (1/28) est périodique à partir de 8 chiffres après la virgule, mais que les 2 premiers chiffres ne font pas parti de la récursion. Donc 8-2=6 chiffres font parti de la récursion. Les chiffres peuvent être obtenus ainsi :
>>> 10**8 / 28
3571428
# Remarquez l'ajout d'un zéro initial, car je dois obtenir 8 chiffres et pas 7 !
D'où 1/28 = 0.03(571428)
Par ailleurs, pour ceux qui utilisent un autre langage de programmation ne possédant pas les entiers "illimités", sachez qu'il est possible de calculer les opérations "(10**X)%Y" sans dépasser 31bits.
Fanelga
Messages postés
27
Date d'inscription
vendredi 6 juin 2014
Statut
Membre
Dernière intervention
29 avril 2015
3
29 avril 2015 à 11:39
29 avril 2015 à 11:39
Ok, je débarque 5 ans plus tard ...
Super réponse en tout cas. Ta méthode est vraiment cool.
Comment ça t'es passé par la tête ??!
Super réponse en tout cas. Ta méthode est vraiment cool.
Comment ça t'es passé par la tête ??!