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

1 réponse

1 2
Avatar
garnote
Dans le même ordre d"idée :

Sub Sensibilité_Aux_Conditions_Initiales()
'Il arrive que la prévision à long terme
'soit impossible (prévisions météo, par exemple)
Dim u(99)
Dim v(99)
Dim w(99)
Application.ScreenUpdating = False
Sheets.Add
Columns("A:C").NumberFormat = "0.000000000000"
'*Conditions initiales presque identiques
u(0) = 0.123456789123
v(0) = 0.123456789124
w(0) = 0.123456789122
'*
Cells(1, 1) = u(0)
Cells(1, 2) = v(0)
Cells(1, 3) = w(0)
For n = 1 To 99
u(n) = 3.96 * u(n - 1) * (1 - u(n - 1))
v(n) = 3.96 * v(n - 1) * (1 - v(n - 1))
w(n) = 3.96 * w(n - 1) * (1 - w(n - 1))
Cells(n + 1, 1) = u(n)
Cells(n + 1, 2) = v(n)
Cells(n + 1, 3) = w(n)
Next n
Columns("A:C").AutoFit
ActiveWindow.ScrollRow = 57
ActiveWindow.ScrollColumn = 1
Application.ScreenUpdating = True
End Sub

Serge


"garnote" a écrit dans le message de news:
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