Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Dépassement de capacité incompréhensible

11 réponses
Avatar
garnote
Bonsoir,

Quand je lance cette macro, j'obtiens un dépassement de capacité.

Sub Absurde()
MsgBox 2003 * 33 * 17 - 6002 * 17 * 17 + 4000 * 17 * 9
End Sub


Il me semble que ça n'a aucun sens ! Qu'en pensez-vous ?

Et pourtant, la formule de feuille de calcul :
=2003 * 33 * 17 - 6002 * 17 * 17 + 4000 * 17 * 9
me donne le bon résultat : 1 105.

Et tant qu'à y être, est-ce qu'il existe un équivalent VBA de PGCD ?


Merci de vos éventuelles aveuglantes lumières :-)

Serge

10 réponses

1 2
Avatar
MichDenis
MsgBox Application.Evaluate("2003 * 33 * 17 - 6002 * 17 * 17 + 4000 * 17 * 9")



"garnote" a écrit dans le message de news:

Bonsoir,

Quand je lance cette macro, j'obtiens un dépassement de capacité.

Sub Absurde()
MsgBox 2003 * 33 * 17 - 6002 * 17 * 17 + 4000 * 17 * 9
End Sub


Il me semble que ça n'a aucun sens ! Qu'en pensez-vous ?

Et pourtant, la formule de feuille de calcul :
03 * 33 * 17 - 6002 * 17 * 17 + 4000 * 17 * 9
me donne le bon résultat : 1 105.

Et tant qu'à y être, est-ce qu'il existe un équivalent VBA de PGCD ?


Merci de vos éventuelles aveuglantes lumières :-)

Serge
Avatar
isabelle
bonjour Serge,

toujours avec evaluate,

x = Evaluate("PGCD(" & [A1] & "," & [A2] & ")")

ou

x = Evaluate("PGCD(" & Range("A1:A10").Address & ")")


isabelle


Bonsoir,

Quand je lance cette macro, j'obtiens un dépassement de capacité.

Sub Absurde()
MsgBox 2003 * 33 * 17 - 6002 * 17 * 17 + 4000 * 17 * 9
End Sub


Il me semble que ça n'a aucun sens ! Qu'en pensez-vous ?

Et pourtant, la formule de feuille de calcul :
03 * 33 * 17 - 6002 * 17 * 17 + 4000 * 17 * 9
me donne le bon résultat : 1 105.

Et tant qu'à y être, est-ce qu'il existe un équivalent VBA de PGCD ?


Merci de vos éventuelles aveuglantes lumières :-)

Serge




Avatar
MichDenis
Si tu préfères : Le rapport entre VBA - le type de variable et l'organisation de la mémoire.

Ceci fonctionne :
'---------------------------------------------
Private Sub MesVariables()

Dim A As Long, b As Long, c As Long
Dim D As Long, E As Long, F As Long
Dim G As Long, H As Long, I As Long
Dim X As Long
A = 2003
b = 33
c = 17
D = 6002
E = 17
F = 17
G = 4000
H = 17
I = 9

X = A * b * c - D * E * F + G * H * I
End Sub

Ceci ne fonctionne pas
'---------------------------------------------
Sub MesVariables1()

Dim A As Integer, b As Integer, c As Integer
Dim D As Integer, E As Integer, F As Integer
Dim G As Integer, H As Integer, I As Integer
Dim X As Integer

A = 2003
b = 33
c = 17
D = 6002
E = 17
F = 17
G = 4000
H = 17
I = 9

X = A * b * c - D * E * F + G * H * I

End Sub
'---------------------------------------------




"MichDenis" a écrit dans le message de news:

MsgBox Application.Evaluate("2003 * 33 * 17 - 6002 * 17 * 17 + 4000 * 17 * 9")



"garnote" a écrit dans le message de news:

Bonsoir,

Quand je lance cette macro, j'obtiens un dépassement de capacité.

Sub Absurde()
MsgBox 2003 * 33 * 17 - 6002 * 17 * 17 + 4000 * 17 * 9
End Sub


Il me semble que ça n'a aucun sens ! Qu'en pensez-vous ?

Et pourtant, la formule de feuille de calcul :
03 * 33 * 17 - 6002 * 17 * 17 + 4000 * 17 * 9
me donne le bon résultat : 1 105.

Et tant qu'à y être, est-ce qu'il existe un équivalent VBA de PGCD ?


Merci de vos éventuelles aveuglantes lumières :-)

Serge
Avatar
garnote
Bonsoir Denis et tous les autres,

Alors, comment adapter le truc de Denis à cette macro ?

Sub Calculs_Avec_Entiers()
Dim n As Byte
Dim h(20) As Long
Dim b(20) As Long
h(0) = 3: b(0) = 2
h(1) = 5: b(1) = 3
Cells(1, 1) = h(0): Cells(2, 1) = b(0)
Cells(3, 1) = h(0) / b(0)
Cells(1, 2) = h(1): Cells(2, 2) = b(1)
Cells(3, 2) = h(1) / b(1)
For n = 2 To 19
h(n) = 2003 * h(n - 1) * h(n - 2) - 6002 * b(n - 1) * h(n - 2) + 4000 * b(n - 1) * b(n - 2)
b(n) = h(n - 1) * h(n - 2)
Cells(1, n + 1) = h(n) / pgcd(h(n), b(n))
Cells(2, n + 1) = b(n) / pgcd(h(n), b(n))
Cells(3, n + 1) = h(n) / b(n)
Next n
End Sub

Function pgcd(a As Long, b As Long)
If a = 0 Then
pgcd = b
Exit Function
Else
If a > b Then
pgcd = pgcd(a Mod b, b)
Else
pgcd = pgcd(b Mod a, a)
End If
End If
End Function

Serge



"MichDenis" a écrit dans le message de news:
MsgBox Application.Evaluate("2003 * 33 * 17 - 6002 * 17 * 17 + 4000 * 17 * 9")



"garnote" a écrit dans le message de news:

Bonsoir,

Quand je lance cette macro, j'obtiens un dépassement de capacité.

Sub Absurde()
MsgBox 2003 * 33 * 17 - 6002 * 17 * 17 + 4000 * 17 * 9
End Sub


Il me semble que ça n'a aucun sens ! Qu'en pensez-vous ?

Et pourtant, la formule de feuille de calcul :
03 * 33 * 17 - 6002 * 17 * 17 + 4000 * 17 * 9
me donne le bon résultat : 1 105.

Et tant qu'à y être, est-ce qu'il existe un équivalent VBA de PGCD ?


Merci de vos éventuelles aveuglantes lumières :-)

Serge





Avatar
isabelle
salut serge,

ça bloque à n=6 h(n)= 1.78055E+11

Long -2 147 483 648 et 2 147 483 647
y'a dépassement


Sub Calculs_Avec_Entiers()
Dim n As Byte
Dim h(20) As Long
Dim b(20) As Long
h(0) = 3: b(0) = 2
h(1) = 5: b(1) = 3
Cells(1, 1) = h(0): Cells(2, 1) = b(0)
Cells(3, 1) = h(0) / b(0)
Cells(1, 2) = h(1): Cells(2, 2) = b(1)
Cells(3, 2) = h(1) / b(1)
For n = 2 To 19
x = Evaluate("2003 * " & h(n - 1) & " * " & h(n - 2) & " - 6002 * " & b(n - 1) & " * " & h(n - 2) & " + 4000 * " & b(n - 1) & " * " & b(n - 2) & "")
[K1] = x
h(n) = x
b(n) = h(n - 1) * h(n - 2)
Cells(1, n + 1) = h(n) / Evaluate("PGCD(" & h(n) & "," & b(n) & ")")
Cells(2, n + 1) = b(n) / Evaluate("PGCD(" & h(n) & "," & b(n) & ")")
Cells(3, n + 1) = h(n) / b(n)
Next n
End Sub


isabelle


Bonsoir Denis et tous les autres,

Alors, comment adapter le truc de Denis à cette macro ?

Sub Calculs_Avec_Entiers()
Dim n As Byte
Dim h(20) As Long
Dim b(20) As Long
h(0) = 3: b(0) = 2
h(1) = 5: b(1) = 3
Cells(1, 1) = h(0): Cells(2, 1) = b(0)
Cells(3, 1) = h(0) / b(0)
Cells(1, 2) = h(1): Cells(2, 2) = b(1)
Cells(3, 2) = h(1) / b(1)
For n = 2 To 19
h(n) = 2003 * h(n - 1) * h(n - 2) - 6002 * b(n - 1) * h(n - 2) + 4000 * b(n - 1) * b(n - 2)
b(n) = h(n - 1) * h(n - 2)
Cells(1, n + 1) = h(n) / pgcd(h(n), b(n))
Cells(2, n + 1) = b(n) / pgcd(h(n), b(n))
Cells(3, n + 1) = h(n) / b(n)
Next n
End Sub

Function pgcd(a As Long, b As Long)
If a = 0 Then
pgcd = b
Exit Function
Else
If a > b Then
pgcd = pgcd(a Mod b, b)
Else
pgcd = pgcd(b Mod a, a)
End If
End If
End Function

Serge



"MichDenis" a écrit dans le message de news:

MsgBox Application.Evaluate("2003 * 33 * 17 - 6002 * 17 * 17 + 4000 * 17 * 9")



"garnote" a écrit dans le message de news:

Bonsoir,

Quand je lance cette macro, j'obtiens un dépassement de capacité.

Sub Absurde()
MsgBox 2003 * 33 * 17 - 6002 * 17 * 17 + 4000 * 17 * 9
End Sub


Il me semble que ça n'a aucun sens ! Qu'en pensez-vous ?

Et pourtant, la formule de feuille de calcul :
03 * 33 * 17 - 6002 * 17 * 17 + 4000 * 17 * 9
me donne le bon résultat : 1 105.

Et tant qu'à y être, est-ce qu'il existe un équivalent VBA de PGCD ?


Merci de vos éventuelles aveuglantes lumières :-)

Serge










Avatar
isabelle
ps/ on se rend à n avec des variables As Double.

isabelle


Bonsoir Denis et tous les autres,

Alors, comment adapter le truc de Denis à cette macro ?

Sub Calculs_Avec_Entiers()
Dim n As Byte
Dim h(20) As Long
Dim b(20) As Long
h(0) = 3: b(0) = 2
h(1) = 5: b(1) = 3
Cells(1, 1) = h(0): Cells(2, 1) = b(0)
Cells(3, 1) = h(0) / b(0)
Cells(1, 2) = h(1): Cells(2, 2) = b(1)
Cells(3, 2) = h(1) / b(1)
For n = 2 To 19
h(n) = 2003 * h(n - 1) * h(n - 2) - 6002 * b(n - 1) * h(n - 2) + 4000 * b(n - 1) * b(n - 2)
b(n) = h(n - 1) * h(n - 2)
Cells(1, n + 1) = h(n) / pgcd(h(n), b(n))
Cells(2, n + 1) = b(n) / pgcd(h(n), b(n))
Cells(3, n + 1) = h(n) / b(n)
Next n
End Sub

Function pgcd(a As Long, b As Long)
If a = 0 Then
pgcd = b
Exit Function
Else
If a > b Then
pgcd = pgcd(a Mod b, b)
Else
pgcd = pgcd(b Mod a, a)
End If
End If
End Function

Serge



"MichDenis" a écrit dans le message de news:

MsgBox Application.Evaluate("2003 * 33 * 17 - 6002 * 17 * 17 + 4000 * 17 * 9")



"garnote" a écrit dans le message de news:

Bonsoir,

Quand je lance cette macro, j'obtiens un dépassement de capacité.

Sub Absurde()
MsgBox 2003 * 33 * 17 - 6002 * 17 * 17 + 4000 * 17 * 9
End Sub


Il me semble que ça n'a aucun sens ! Qu'en pensez-vous ?

Et pourtant, la formule de feuille de calcul :
03 * 33 * 17 - 6002 * 17 * 17 + 4000 * 17 * 9
me donne le bon résultat : 1 105.

Et tant qu'à y être, est-ce qu'il existe un équivalent VBA de PGCD ?


Merci de vos éventuelles aveuglantes lumières :-)

Serge










Avatar
MichDenis
Pour tester ton truc, utilise la fenêtre Exécution : pour l'afficher Ctrl + G

Et tu ajoutes à ta procédure la ligne debug

For n = 2 To 19
h(n) = 2003 * h(n - 1) * h(n - 2) - 6002 * b(n - 1) * h(n - 2) + 4000 * b(n - 1) * b(n - 2)
b(n) = h(n - 1) * h(n - 2)
'17045
Debug.Print h(n), b(n)
Cells(1, n + 1) = h(n) / pgcd(h(n), b(n))
Debug.Print h(n), b(n)
Cells(2, n + 1) = b(n) / pgcd(h(n), b(n))
Cells(3, n + 1) = h(n) / b(n)
Cells(3, 3 + 1) = h(3) / 135(3)
Next n

Et tu roules ta procédure




"garnote" a écrit dans le message de news:

Bonsoir Denis et tous les autres,

Alors, comment adapter le truc de Denis à cette macro ?

Sub Calculs_Avec_Entiers()
Dim n As Byte
Dim h(20) As Long
Dim b(20) As Long
h(0) = 3: b(0) = 2
h(1) = 5: b(1) = 3
Cells(1, 1) = h(0): Cells(2, 1) = b(0)
Cells(3, 1) = h(0) / b(0)
Cells(1, 2) = h(1): Cells(2, 2) = b(1)
Cells(3, 2) = h(1) / b(1)
For n = 2 To 19
h(n) = 2003 * h(n - 1) * h(n - 2) - 6002 * b(n - 1) * h(n - 2) + 4000 * b(n - 1) * b(n - 2)
b(n) = h(n - 1) * h(n - 2)
Cells(1, n + 1) = h(n) / pgcd(h(n), b(n))
Cells(2, n + 1) = b(n) / pgcd(h(n), b(n))
Cells(3, n + 1) = h(n) / b(n)
Next n
End Sub

Function pgcd(a As Long, b As Long)
If a = 0 Then
pgcd = b
Exit Function
Else
If a > b Then
pgcd = pgcd(a Mod b, b)
Else
pgcd = pgcd(b Mod a, a)
End If
End If
End Function

Serge



"MichDenis" a écrit dans le message de news:

MsgBox Application.Evaluate("2003 * 33 * 17 - 6002 * 17 * 17 + 4000 * 17 * 9")



"garnote" a écrit dans le message de news:

Bonsoir,

Quand je lance cette macro, j'obtiens un dépassement de capacité.

Sub Absurde()
MsgBox 2003 * 33 * 17 - 6002 * 17 * 17 + 4000 * 17 * 9
End Sub


Il me semble que ça n'a aucun sens ! Qu'en pensez-vous ?

Et pourtant, la formule de feuille de calcul :
03 * 33 * 17 - 6002 * 17 * 17 + 4000 * 17 * 9
me donne le bon résultat : 1 105.

Et tant qu'à y être, est-ce qu'il existe un équivalent VBA de PGCD ?


Merci de vos éventuelles aveuglantes lumières :-)

Serge





Avatar
MichDenis
Le deuxième debug est de trop ...


"MichDenis" a écrit dans le message de news:

Pour tester ton truc, utilise la fenêtre Exécution : pour l'afficher Ctrl + G

Et tu ajoutes à ta procédure la ligne debug

For n = 2 To 19
h(n) = 2003 * h(n - 1) * h(n - 2) - 6002 * b(n - 1) * h(n - 2) + 4000 * b(n - 1) * b(n - 2)
b(n) = h(n - 1) * h(n - 2)
'17045
Debug.Print h(n), b(n)
Cells(1, n + 1) = h(n) / pgcd(h(n), b(n))
Debug.Print h(n), b(n)
Cells(2, n + 1) = b(n) / pgcd(h(n), b(n))
Cells(3, n + 1) = h(n) / b(n)
Cells(3, 3 + 1) = h(3) / 135(3)
Next n

Et tu roules ta procédure




"garnote" a écrit dans le message de news:

Bonsoir Denis et tous les autres,

Alors, comment adapter le truc de Denis à cette macro ?

Sub Calculs_Avec_Entiers()
Dim n As Byte
Dim h(20) As Long
Dim b(20) As Long
h(0) = 3: b(0) = 2
h(1) = 5: b(1) = 3
Cells(1, 1) = h(0): Cells(2, 1) = b(0)
Cells(3, 1) = h(0) / b(0)
Cells(1, 2) = h(1): Cells(2, 2) = b(1)
Cells(3, 2) = h(1) / b(1)
For n = 2 To 19
h(n) = 2003 * h(n - 1) * h(n - 2) - 6002 * b(n - 1) * h(n - 2) + 4000 * b(n - 1) * b(n - 2)
b(n) = h(n - 1) * h(n - 2)
Cells(1, n + 1) = h(n) / pgcd(h(n), b(n))
Cells(2, n + 1) = b(n) / pgcd(h(n), b(n))
Cells(3, n + 1) = h(n) / b(n)
Next n
End Sub

Function pgcd(a As Long, b As Long)
If a = 0 Then
pgcd = b
Exit Function
Else
If a > b Then
pgcd = pgcd(a Mod b, b)
Else
pgcd = pgcd(b Mod a, a)
End If
End If
End Function

Serge



"MichDenis" a écrit dans le message de news:

MsgBox Application.Evaluate("2003 * 33 * 17 - 6002 * 17 * 17 + 4000 * 17 * 9")



"garnote" a écrit dans le message de news:

Bonsoir,

Quand je lance cette macro, j'obtiens un dépassement de capacité.

Sub Absurde()
MsgBox 2003 * 33 * 17 - 6002 * 17 * 17 + 4000 * 17 * 9
End Sub


Il me semble que ça n'a aucun sens ! Qu'en pensez-vous ?

Et pourtant, la formule de feuille de calcul :
03 * 33 * 17 - 6002 * 17 * 17 + 4000 * 17 * 9
me donne le bon résultat : 1 105.

Et tant qu'à y être, est-ce qu'il existe un équivalent VBA de PGCD ?


Merci de vos éventuelles aveuglantes lumières :-)

Serge





Avatar
garnote
Merci à vous deux pour vos intéressants commentaires.

Suite à de multiples tripotages arithmétiques, j'ai constaté que,
connaissant u(0) = h(0) / b(0) = 3/2 et u(1) = h(1) / b(1) = 5/3,
alors u(n) = 2003 - 6002 / u(n - 1) + 4000 / (u(n - 1) * u(n - 2))
est équivalent à u(n) = h(n) / b(n) où :
h(n) = h(n - 1) + 2 ^ n
b(n) = h(n - 1)

Et quelle surprise de constater l'énorme différence entre les
deux résultats. C'est la macro DEUX qui donne le bon résultat

Sub Virgules_Flottantes_Et_Nombres_Entiers()
Sheets.Add
UN
DEUX
End Sub

Sub UN()
Dim u(20)
u(0) = 3 / 2
u(1) = 5 / 3
[A5] = u(0)
[B5] = u(1)
For n = 2 To 19
u(n) = 2003 - 6002 / u(n - 1) + 4000 / (u(n - 1) * u(n - 2))
Cells(5, n + 1) = u(n)
Next n
End Sub

Sub DEUX()
Dim n As Byte
Dim h(20) As Long
Dim b(20) As Long
h(0) = 3: b(0) = 2
h(1) = 5: b(1) = 3
Cells(1, 1) = h(0): Cells(2, 1) = b(0)
Cells(3, 1) = h(0) / b(0)
Cells(1, 2) = h(1): Cells(2, 2) = b(1)
Cells(3, 2) = h(1) / b(1)
For n = 2 To 19
h(n) = h(n - 1) + 2 ^ n
b(n) = h(n - 1)
Cells(1, n + 1) = h(n)
Cells(2, n + 1) = b(n)
Cells(3, n + 1) = h(n) / b(n)
Next n
End Sub

Serge
Avatar
garnote
Bonsoir et/ou Bonjour et/ou Bonne nuit,

Vous ne trouvez pas ça inquiétant cette affaire-là ?
Comment savoir qu'une itération en virgules flottantes
puisse conduire à des résultats aussi aberrants !
Parce que dans ce cas-ci ( et il y en a sûrement d'autres ),
au diable les prévisions à long terme !!!

Serge


"garnote" a écrit dans le message de news: %
Merci à vous deux pour vos intéressants commentaires.

Suite à de multiples tripotages arithmétiques, j'ai constaté que,
connaissant u(0) = h(0) / b(0) = 3/2 et u(1) = h(1) / b(1) = 5/3,
alors u(n) = 2003 - 6002 / u(n - 1) + 4000 / (u(n - 1) * u(n - 2))
est équivalent à u(n) = h(n) / b(n) où :
h(n) = h(n - 1) + 2 ^ n
b(n) = h(n - 1)

Et quelle surprise de constater l'énorme différence entre les
deux résultats. C'est la macro DEUX qui donne le bon résultat

Sub Virgules_Flottantes_Et_Nombres_Entiers()
Sheets.Add
UN
DEUX
End Sub

Sub UN()
Dim u(20)
u(0) = 3 / 2
u(1) = 5 / 3
[A5] = u(0)
[B5] = u(1)
For n = 2 To 19
u(n) = 2003 - 6002 / u(n - 1) + 4000 / (u(n - 1) * u(n - 2))
Cells(5, n + 1) = u(n)
Next n
End Sub

Sub DEUX()
Dim n As Byte
Dim h(20) As Long
Dim b(20) As Long
h(0) = 3: b(0) = 2
h(1) = 5: b(1) = 3
Cells(1, 1) = h(0): Cells(2, 1) = b(0)
Cells(3, 1) = h(0) / b(0)
Cells(1, 2) = h(1): Cells(2, 2) = b(1)
Cells(3, 2) = h(1) / b(1)
For n = 2 To 19
h(n) = h(n - 1) + 2 ^ n
b(n) = h(n - 1)
Cells(1, n + 1) = h(n)
Cells(2, n + 1) = b(n)
Cells(3, n + 1) = h(n) / b(n)
Next n
End Sub

Serge



1 2