CALCULETTE POUR LES TRÈS, TRÈS, VRAIMENT TRÈS GRANDS NOMBRES
cs_Warny
Messages postés473Date d'inscriptionmercredi 7 août 2002StatutMembreDernière intervention10 juin 2015
-
20 avril 2004 à 09:28
vegetalain
Messages postés747Date d'inscriptionmardi 25 mars 2003StatutMembreDernière intervention11 août 2022
-
3 janv. 2008 à 20:58
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
vegetalain
Messages postés747Date d'inscriptionmardi 25 mars 2003StatutMembreDernière intervention11 août 2022 3 janv. 2008 à 20:58
ok, merci je vais tester ça... pour le temps d'exécution c pas grav', du moment que le résultat est là :)
cs_akim77
Messages postés73Date d'inscriptionlundi 12 avril 2004StatutMembreDernière intervention17 septembre 20084 3 janv. 2008 à 20:20
J'avais fait une fonction Puissance ( une simple boucle de la fonction Multiplication ), mais les temps de calcul étaient "inhumains" ( 2^10000 en plus d'une minute )
Public Function Puissance(X As String, Y As String, cde As Boolean, nb_chiffres As Long) As String
Puissance = ""
nb_chiffres = 0
If X <> "" And Y <> "" Then
If verify_entiers_positifs(X, Y) Then
If X = "0" Then
Puissance = "0"
Else If X "1" Or Y "0" Then
Puissance = "1"
Else
If Val(Y) > 0 And Val(Y) < 10001 Then '10001 temps de calcul inhumain ???(a determiner)
Puissance = X
Dim j
For j = 1 To Val(Y) - 1
Puissance = Multiplication(Puissance, X, 0, 0)
Next j
nb_chiffres = Len(Puissance)
Else
Puissance = "Y est trop grand, temps de calcul inhumain, trouver une autre methode"
End If
End If
End If
Else
Puissance = "Des nombres entiers positifs uniquement"
End If
End If
End Function
Pour info: Val(Y) donne un Double
et
20^55=360287970189639680000000000000000000000000000000000000000000000000000000
temps calcul < 1 sec (ouf!)
vegetalain
Messages postés747Date d'inscriptionmardi 25 mars 2003StatutMembreDernière intervention11 août 2022 3 janv. 2008 à 17:02
Et comment faire pour les puissances?... je n'arrive pas à obtenir un résultat "normal", c'est à chaque fois ce type de résultat... par exemple pour 20^55 on a 3,6028797018963968e+71... des sources que j'ai trouvé ici celle-ci se rapproche le plus de ce que j'aimerais obtenir omme résultat...
dnob700
Messages postés44Date d'inscriptionmardi 17 février 2004StatutMembreDernière intervention 5 novembre 2007 22 avril 2004 à 17:29
Ton code est pas mal, mais un peu lent pour les grand nombre.
Je te conseille de remplacer les chaine de caractère par des tableau d'octet, tu verras, c'est bcp plus rapide (il faut juste des routines de conversion pour les afficher) et le code est plus simple (les retenu par exemple pour la multiplication sont plus facile etc.)
cs_akim77
Messages postés73Date d'inscriptionlundi 12 avril 2004StatutMembreDernière intervention17 septembre 20084 21 avril 2004 à 20:21
Merci pour cette bonne note ça m'arrive pas trop souvent !
En fait je ne gère que les entiers positifs.
Si tu as supprimé la Sub suivante , le résultat est forcémment
érroné.
Private Sub Text1_KeyPress(KeyAscii As Integer)
Dim X
X = Asc(Chr(KeyAscii))
If (X < 48 Or X > 57) Then KeyAscii = 0 'que des chiffres
If X 8 Then KeyAscii 8 'sauf le rub out
End Sub
Vous pouvez recupérer , modifier , adapter , améliorer et publier
c'est du pur open source !
bouv
Messages postés1411Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention 3 mars 20191 20 avril 2004 à 21:40
Resalut,
G trouvé une faille
Si tu fait :
4 - 1,333 tu obtient -103 329 au lieu de 2,667
De même
-4 + 1 = 5 au lieu de -3
Il y a en fait un pb au niveau des signes et virgules dans les nbres sources
Mais cela reste un super truc.
Encore bravo
bouv
Messages postés1411Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention 3 mars 20191 20 avril 2004 à 20:40
Chapeau bas l'ami,
ton truc est terrible je te met 10/10.
Je me suis permis de créer une dll a partir de ton code, afin de le réutiliser dans n'importe quel prog sans tout rettaper. Mais tout le merite te revient.
Je ne sais pas pourquoi, mais je n'arrive pas à publier la source.
Si tu veux que je te l'envoi afin que tu le fasses (cela serait plus logique). Donne moi ton email.
++
OverDarck
Messages postés116Date d'inscriptionjeudi 12 juillet 2001StatutMembreDernière intervention23 juin 2005 20 avril 2004 à 11:29
un mot :ENORME c'est vraiment genial et pile ce que je cherchais !!!
Win Xp fait la meme chose avec sa power toy calculator mais s'arrete a 512 chifre et puis avori a sa portée un algo de calcul manuel des 4 principales operations, ca c'est vraiment cool !!!!!
Je cherchais a faire un truc dans le genre mais sa aurai etait tres tres lent si j'avais reussit...
Frenchement BRAVO, GRANDIOSE
10/10
@++ merci, et bonne prog
(j'essairai d'adapter ton prog, pour fair qq chose de plus abouti)
cs_Warny
Messages postés473Date d'inscriptionmercredi 7 août 2002StatutMembreDernière intervention10 juin 2015 20 avril 2004 à 09:28
impressionnant,
une petite critique : tu devrais mutualiser ta procédure pour éliminer les zéros non significatifs du résultat.
Un super bon point : si tu rajoute le calcul modulo, tu pourras implémenter RSA.
Ceci dit, je vais faire un peu de recup dans ton code.
3 janv. 2008 à 20:58
3 janv. 2008 à 20:20
Public Function Puissance(X As String, Y As String, cde As Boolean, nb_chiffres As Long) As String
Puissance = ""
nb_chiffres = 0
If X <> "" And Y <> "" Then
If verify_entiers_positifs(X, Y) Then
If X = "0" Then
Puissance = "0"
Else If X "1" Or Y "0" Then
Puissance = "1"
Else
If Val(Y) > 0 And Val(Y) < 10001 Then '10001 temps de calcul inhumain ???(a determiner)
Puissance = X
Dim j
For j = 1 To Val(Y) - 1
Puissance = Multiplication(Puissance, X, 0, 0)
Next j
nb_chiffres = Len(Puissance)
Else
Puissance = "Y est trop grand, temps de calcul inhumain, trouver une autre methode"
End If
End If
End If
Else
Puissance = "Des nombres entiers positifs uniquement"
End If
End If
End Function
Pour info: Val(Y) donne un Double
et
20^55=360287970189639680000000000000000000000000000000000000000000000000000000
temps calcul < 1 sec (ouf!)
Vois le prog de DNOB700
http://www.vbfrance.com/codes/JUSTE-AUTRE-LIBRAIRIE-CALCUL-PRECISION-INFINIE_22182.aspx
plus "pro" que le mien.
3 janv. 2008 à 17:02
22 avril 2004 à 17:29
Je te conseille de remplacer les chaine de caractère par des tableau d'octet, tu verras, c'est bcp plus rapide (il faut juste des routines de conversion pour les afficher) et le code est plus simple (les retenu par exemple pour la multiplication sont plus facile etc.)
21 avril 2004 à 20:21
En fait je ne gère que les entiers positifs.
Si tu as supprimé la Sub suivante , le résultat est forcémment
érroné.
Private Sub Text1_KeyPress(KeyAscii As Integer)
Dim X
X = Asc(Chr(KeyAscii))
If (X < 48 Or X > 57) Then KeyAscii = 0 'que des chiffres
If X 8 Then KeyAscii 8 'sauf le rub out
End Sub
Vous pouvez recupérer , modifier , adapter , améliorer et publier
c'est du pur open source !
20 avril 2004 à 21:40
G trouvé une faille
Si tu fait :
4 - 1,333 tu obtient -103 329 au lieu de 2,667
De même
-4 + 1 = 5 au lieu de -3
Il y a en fait un pb au niveau des signes et virgules dans les nbres sources
Mais cela reste un super truc.
Encore bravo
20 avril 2004 à 20:40
ton truc est terrible je te met 10/10.
Je me suis permis de créer une dll a partir de ton code, afin de le réutiliser dans n'importe quel prog sans tout rettaper. Mais tout le merite te revient.
Je ne sais pas pourquoi, mais je n'arrive pas à publier la source.
Si tu veux que je te l'envoi afin que tu le fasses (cela serait plus logique). Donne moi ton email.
++
20 avril 2004 à 11:29
Win Xp fait la meme chose avec sa power toy calculator mais s'arrete a 512 chifre et puis avori a sa portée un algo de calcul manuel des 4 principales operations, ca c'est vraiment cool !!!!!
Je cherchais a faire un truc dans le genre mais sa aurai etait tres tres lent si j'avais reussit...
Frenchement BRAVO, GRANDIOSE
10/10
@++ merci, et bonne prog
(j'essairai d'adapter ton prog, pour fair qq chose de plus abouti)
20 avril 2004 à 09:28
une petite critique : tu devrais mutualiser ta procédure pour éliminer les zéros non significatifs du résultat.
Un super bon point : si tu rajoute le calcul modulo, tu pourras implémenter RSA.
Ceci dit, je vais faire un peu de recup dans ton code.