miamiaca
Messages postés17Date d'inscriptiondimanche 5 mars 2006StatutMembreDernière intervention22 février 2007
-
16 févr. 2007 à 21:31
Gobillot
Messages postés3140Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention11 mars 2019
-
16 mars 2007 à 00:16
Salut tt le monde
j'ai un problème avec l'erreur 6 "dépassement de capacité"
Voila le code source
dim rib as string
---
---il ya des traitement concernat le rib
---
rib = Val(rib)
ribinter = rib * 100
ribinter = ribinter Mod 97 --- ici l'erreur de dépassement de capacité
MsgBox ribinter
Merci de répondre
A voir également:
L'opération arithmétique a provoqué un dépassement de capacité
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 17 févr. 2007 à 00:07
Bon (je fatigue...)
Je crois que je tiens un bout (en prenant le problème complètement à l'envers) . Il semble que j'y parvienne, mais :
1) le calcul est très lent (près de 150 secondes !)
2) le ventilo de refroidissement de mon processeur tourne rapidement à fond, ce qui montre que le processeur est sur-sollicité ....)
Je vais essayer de continuer ainsi demain, mais en tentant de trouver quelques feintes pour "faire de gros bons" au départ et "des bonds plus petits" au fur et à mesure que je me rapprocherai du "bout"...
Une autre fois : je suis maintenant fatigué. Celà devrait aller moins mal demain !
Bonne nuit !
Gobillot
Messages postés3140Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention11 mars 201934 17 févr. 2007 à 01:13
il me semble que le decimal est sur 14 octets et non pas 16,
pourtant 12 octets utilisés (96 bits) et 29 chiffres possible
solution ultra simple avec le decimal
j'ai voulu voir si le Currency était capable de le faire
c'est la division qui pose problème, il faut donc procéder par soustractions.
Dim rib As Currency
Dim cod As Currency
' attention à la virgule pour découper les 4 décimales
rib = CCur("12345678901234,5678")
Gobillot
Messages postés3140Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention11 mars 201934 17 févr. 2007 à 01:19
pour le Currency, oublie le Text1 et le DoEvents
<strike> Text1 = rib
DoEvents
</strike>c'était pour le test, comme je procédais par soustraction de 0.0097, le résultat n'arrivais jamais
sinon le résultat est quasi instantané.
Daniel
Vous n’avez pas trouvé la réponse que vous recherchez ?
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 17 févr. 2007 à 07:56
Bravo Gobillot,
Je n'avais pas pensé à ta deuxième solution.
Ta première solution était par ailleurs celle que j'avais commencé à faire tourner hier et en effet, ce matin, je m'apprétais comme toi à oter d'emblée 97000000000000 pour soulager mon processeur.
Cette nuit, avant de m'endormir, j'avais pensé à d'autres solutions qui auraient également fonctionné mais qui, maintenant, deviennent totalement inutiles : en utilisant une conjugaison des 2 faits suivants :
(a + b) mod x = a mod x + b mod x
et par ailleurs
a * 10^x mod b = (a * 10^x mod b) mid b
Il ne restait alors qu'à décomposer en 2 groupes de 9 caractères et traiter le modulo du 1er (en le multipliant par 10^9) et d'y ajouter le modulo du second. puis, si ce modulo c était lui mêle supérieyr à b, extraire c mod b
miamiaca
Messages postés17Date d'inscriptiondimanche 5 mars 2006StatutMembreDernière intervention22 février 2007 17 févr. 2007 à 14:35
merci pour vous mais
il ya un problème
quand j'utilise
ce code:
Dim rib As Variant
rib = CDec("123456789012345678")
rib = rib * 100
MsgBox rib - Int(rib / 97) * 97
il me renvoi un resultat faux
dans mon exemple l'ai le rib = 081030007240026060
donc il faut que la fonction renvoi 85
mais avec ce code il me renvoi 90
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 17 févr. 2007 à 17:08
Ouais ! on n'est pas sorti de l'auberge, là !
Ma deuxième méthode, qui fonctionne très bien à la main, plante également quand je passe à la puissance (vb ne peut suivre !)
Mais la vue de la mer vient de me donner une autre idée encore, que je vais essayer de mettre en oeuvre.
Je viendrai (réussite ou échec) en rendre compte dans quelques minutes......
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 17 févr. 2007 à 18:14
L'histoire est assez amusante, au bout du compte, et je me demande si cela ne vaudrait pas le coup de répéter ce genre de truc pour traiter la plupart des opérations (addition, soustraction, diviision, multiplication) appliquées à de très grands nombre...
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 17 févr. 2007 à 18:28
Bonsoir Daniel...
Mai tu as tout-à-fait raison !
Je me suis fait avoir (j'ai cru sur parole, sans vérifier, Miamaca... et ai pensé bêtement que son erreur pouvait résulter de ce que le RIB commençait par un 0)...
Je me suis donc cassé la tête pour rien ....
Je viens de tester ton code avec le rib "à problème" de Mamiaca et ton résultat est bon ...
Gobillot
Messages postés3140Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention11 mars 201934 17 févr. 2007 à 19:05
Salut jmf,
"Je me suis donc cassé la tête pour rien ...."
non, non j'ai apprécié ton code, il est valable, surtout qu'il est pas limité en nombre de caractères, c'est pas le cas pour le variant qui marche dans le cas ici présent mais ne marchera pas pour les très grand nombre.
je me suis amusé aussi avec le currency, il donne le même résultat, mais 5 fois moins rapide et difficile à mettre en oeuvre.
donc ton code peux servir de base pour les opérations sur les très grand nombre
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 17 févr. 2007 à 20:24
Merci Daniel...
Etant à moitié corse (par ma mère) je déteste en effet faire des efforts non justifiés.
Mais tu as raison : en calculant "à la manuelle", aucune limitation... c'est vrai.
On s'y met alors ? (Pas trop à la fois) : pour les autres opérations ? (je sais que tu peux et tu sais que je peux)... on y va ?
On pourrait servir le tout dans... disons un mois (je suis vraiment à moitié corse )
Gobillot
Messages postés3140Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention11 mars 201934 17 févr. 2007 à 21:13
premier essai l'addition
déjà pas aussi évident
je me simplifie la vie, 2 nombres entiers sous forme de chaîne et de même longueur
addtion par tranche de 5 en commençant par la fin
il faut trouver nb3 tel que nb3 = nb1 + nb2
r = 0
For i = Len(nb1) - 4 To 1 Step -5
t = Val(Mid$(nb1, i, 5)) + Val(Mid$(nb2, i, 5)) + r
r = t \ 100000
t = t - r * 100000
nb3 = Format$(t, "00000") & nb3
Next
i = i + 4
If i > 0 Then
t = Val(Mid$(nb1, 1, i)) + Val(Mid$(nb2, 1, i))
Else
t = 0
End If
t = t + r
If t > 0 Then nb3 = t & nb3
MsgBox nb3
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 17 févr. 2007 à 21:29
Mais c'est fameux, Daniel !
Pour moi, à première analyse, il n'y a rien à retoucher !
Quand au fait que tu as choisi 2 chaines de longueuur identique, ma foi, ce n'est vraiment pas un problème, puiqu'il suffit de compléter la plus courte des deux par un nombre de "0" placer devant tels que ce nombre = len(lapluslongue) - len(lapluscourte)
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 17 févr. 2007 à 21:57
Bon (mais ce sera la dernière pour moi aujourd'hui... me faut me rrreposer...oun peu... hein ! )
voilà la division (me suis contenté de visiser un très grand par du "normal" :
Private Sub Command1_Click()
rib = "12345678901234567890123456" 'voilà notre chiffre
'à diviser par
divi = 1227
preci = 3 'ici notre précision de décimales (à déterminer à sa guise)
Dim valreste As Integer, reste As String
For i = 1 To Len(rib) Step Len(Str(divi))
reste = reste & Mid(rib, i, Len(Str(divi)))
valreste = val(reste) Mod divi
resul = resul & val(reste) \ divi
reste = Str(valreste)
Next
If reste > 0 Then
resul = resul & "."
For j = 1 To preci
reste = Str(valreste) & "0"
valreste = val(reste) Mod divi
resul = resul & val(reste) \ divi
reste = Str(valreste)
Next j
End If
MsgBox resul
End Sub
Gobillot
Messages postés3140Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention11 mars 201934 18 févr. 2007 à 14:16
correction pour la division:
Str() rajoute déjà un espace devant
pas oublier de rajouter les zéros devant resul
sauf à la fin où il ne reste plus que 3 chiffres (donc 329 et non pas 00329)
rib = "1227206001901234567890113456"
divi = 1227
resul = 101678907152622567329.629 'manque des zéros
resul = 1000167890710052622567329.629
For i = 1 To Len(rib) Step Len(Str(divi))
reste = reste & Mid(rib, i, Len(Str(divi)))
valreste = val(reste) Mod divi
resul = resul & Format$(Val(reste) \ divi, "00000") 'sauf à la fin
reste = Str(valreste)
Next
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 18 févr. 2007 à 14:36
Merci Daniel.
Je passerai demain à la multiplication...
Dis-donc, toi...
Quand nous aurons fini le tour (jusqu'à la limite possible, bien entendu.... car il va y avoir une limite)
On pourrait peut-être se mettre en contact par MP pour mettre en place, à deux, un outil demo perfectionné...
Si tu en es d'accord, il te sera ensuite possible de proposer une source à déposer...(et tu en serais le dépositaire)
Dès que les choses commenceront à être bien précisées, je commencerais bien volontiers une interface à te soummettre en proposition.
Qu'en dis-tu ?
J'ai essayré de trouver l'équivalent avec Google, sur VB, et n'ai rien trouvé ! Ce ne serait donc pas mal du tout....