Dépassement de capacité

Résolu
miamiaca Messages postés 17 Date d'inscription dimanche 5 mars 2006 Statut Membre Dernière intervention 22 février 2007 - 16 févr. 2007 à 21:31
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 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

43 réponses

jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
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 !
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
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")
  
    cod = CCur("97000000000000")
    While cod > 0.001
       While rib > cod
          rib = rib - cod
          Text1 = rib
          DoEvents
          Wend
       cod = cod / 10
       Wend
   rib = rib * 1000000
   MsgBox rib - Int(rib / 97) * 97

Daniel
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
17 févr. 2007 à 01:14
pour le decimal:

    Dim rib As Variant
  
    rib = CDec("123456789012345678")

    rib = rib * 100
    MsgBox rib - Int(rib / 97) * 97

Daniel
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
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

Ta deuxième solution est bien plus simple
0
miamiaca Messages postés 17 Date d'inscription dimanche 5 mars 2006 Statut Membre Dernière intervention 22 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
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
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......
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
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...

Et si on en faisait un bon petit exemple ?
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
17 févr. 2007 à 18:15
pourtant j'ai le bon résultat:

    Dim rib As Variant

 

    rib = CDec("081030007240026060")

   

    rib = rib * 100

'   MsgBox rib                      ' -->  8103000724002606000

'   MsgBox Int(rib / 97)            ' -->    83536089938171195

'   MsgBox Int(rib / 97) * 97       ' -->  8103000724002605915

    MsgBox rib - Int(rib / 97) * 97 ' -->                   85

Daniel
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
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 ...
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
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

Daniel
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
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  )
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
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

    Dim nb1$, nb2$, nb3$, i&, t&, r&
   
    nb1 = "8580123456789012345678901"
    nb2 = "3115081030007240026060123"
    nb3 = ""
   
    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

Daniel
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
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)

exemple, donc :

    nb1 = "8580123456789012345678901"
    nb2 = "357"
    nb2 = String(Len(nb1) - Len(nb2), "0") & nb2

Et vas pas trop vite, hein... (tu vas me fatiquer...)
0
miamiaca Messages postés 17 Date d'inscription dimanche 5 mars 2006 Statut Membre Dernière intervention 22 février 2007
17 févr. 2007 à 21:45
merciiiiiiiiii
beaucoup
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
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
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
17 févr. 2007 à 21:59
Aie !

Correction (pour éviter le calcul des retenues )

For i = 1 To Len(rib) Step Len(Str(divi)) + 1
    reste = reste & Mid(rib, i, Len(Str(divi)) + 1)
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
17 févr. 2007 à 22:44
bon j'ai testé la division, le temps de rajouter les définitions
    Dim rib$, divi&, resul$, i&, j&, preci%

ça a l'air de marcher nickel
pour division avec 2 très grand nombres, ça va pas être coton

Daniel
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
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

Daniel
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
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....
0
Rejoignez-nous