Rem c'est delirant le VB

ortollj

XLDnaute Nouveau
Rem c'est delirant le VB, si je mets les deux lignes ci dessous sur la meme ligne ca ne compile pas !

' comme ca: If P <= N Then combint = ComBin(N, P):mad:

If P <= N Then
combint = ComBin(N, P)
Else
combint = 0
End If
 

ROGER2327

XLDnaute Barbatruc
Re : Rem c'est delirant le VB

Re...
Votre souci vient de là :
Code:
[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 :
Code:
[COLOR="DarkSlateGray"][B]ComBina = [N/(N-P)]*[(N-1)/(N-P-1)]*[(N-2)/(N-P-2)]* ... *[(P+2)/2]*[(P+1)/1][/B][/COLOR]
Ce qui donne, en une seule boucle :
Code:
[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...​
ROGER2327
#2834
 

Statistiques des forums

Discussions
312 671
Messages
2 090 764
Membres
104 658
dernier inscrit
amomo