Bug ou non
Voici 3 procédures de calcul d’une factorielle.
Deux sont des procédures récursives.
La troisième utilise une procédure itérative pour contrôle
Parmi les deux procédures récursives l’une (fact_m) donne à partir de n=> 9 des résultats erronés comme si le résultat provenait d’un type .long et non d’un type flottant double précision
Par contre la procédure fact donne des résultats OK
La seule différence entre les deux procédures est l’ordre du produit
n*fact(n-1) et fact(n-1)*n alors que fact_m() et fact() sont définies en flottant double précision et n dans la procédure fact_m est aussi défini en type flottant double précision
A+
Bug or not
Here are three procedures for calculating a factor.
Both are recursive procedures.
The third uses an iterative procedure to control
Of the two recursive procedures one (fact_m) gives from n => 9 erroneous if the result came as a type results. long and not a double-precision floating type
In fact against the procedure is working OK
The only difference between the two procedures is the order of the product
n * fact (n-1) and fact (n-1) * n while fact_m () and fact () are defined in double precision floating and n in fact_m procedure is defined as double precision floating-point
A +
Code:
Procedure.d Fact(n.l)
If n<2
ProcedureReturn 1.0
Else
ProcedureReturn Fact(n-1)*n
EndIf
EndProcedure
Debug Fact(10)
Procedure.d Fact_M(n.d)
If n<2
ProcedureReturn 1.0
Else
ProcedureReturn n*Fact_m(n-1)
EndIf
EndProcedure
Debug Fact_m(10)
Procedure.d Factoriel(valeur.l)
Resultat.d=1
For n=2 To valeur
Resultat*n
Next
ProcedureReturn Resultat
EndProcedure
For n=1 To 12
Debug Str(n)+"! = "+StrD(Factoriel(n))
Debug Str(n)+"! = "+StrD(Fact(n))
Debug Str(n)+"! = "+StrD(Fact_m(n))
nd.d=n
Debug Str(n)+"! = "+StrD(Fact_m(nd))
Next
A+