Vous utilisez un navigateur obsolète. Il se peut que ce site ou d'autres sites Web ne s'affichent pas correctement. Vous devez le mettre à jour ou utiliser un navigateur alternatif.
[COLOR="DarkSlateGray"][B] For i = TopBound To N
num = num * i
Next i
For i = 1 To LowBound
div = div * i
Next i[/B][/COLOR]
Ces boucles peuvent rapidement provoquer un dépassement de capacité.
En fait (en supposant que P>=N/2), vous calculez séparément
num = (P+1)*(P+2)* ... *(N-1)*N
et
div = 1*2* ... *(N-P-1)*(N-P)
(c'est-à-dire (N-P)!), puis vous divisez num par div.
Pour éviter d'obtenir de trop grands nombres, vous pouvez réorganiser le calculs en couplant les deux boucles pour travailler avec des résultats intermédiaires les plus petits possible et calculer :
[COLOR="DarkSlateGray"][B] ComBina = 1
For i = LowBound To 1 Step -1
ComBina = ComBina * (N - LowBound + i) / i
Next i[/B][/COLOR]
Il faut bien entendu que ComBina soit de type Double.
En faisant cela, vous pourrez constater que les tests du début de procédure deviennent inutiles. En les supprimant, vous obtiendrez :
Code:
[COLOR="DarkSlateGray"][B]Function ComBina(ByVal N As Long, ByVal P As Long) As Double
Dim LowBound As Long
Dim i As Integer
LowBound = WorksheetFunction.Min(P, N - P)
ComBina = 1
For i = LowBound To 1 Step -1
ComBina = ComBina * (N - LowBound + i) / i
Next i
End Function[/B][/COLOR]
qui est très proche de la procédure que j'ai utilisée, dès lors qu'on en élimine le calcul logarithmique :
Code:
[COLOR="DarkSlateGray"][B]Function ComBin2(N, P)
Application.Volatile
Dim i As Long, expo As Long
ComBin2 = 1
On Error GoTo E
N = Int(N)
P = Int(P)
P = WorksheetFunction.Min(P, N - P)
For i = P To 1 Step -1
ComBin2 = ComBin2 * (N - P + i) / i
Next i
S: On Error GoTo 0
Exit Function
E: ComBin2 = "#NOMBRE!": Resume S
End Function[/B][/COLOR]
En espérant que ces considérations vous soient utiles...
Ce site utilise des cookies pour personnaliser le contenu, adapter votre expérience et vous garder connecté si vous vous enregistrez.
En continuant à utiliser ce site, vous consentez à notre utilisation de cookies.