violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 21 déc. 2005 à 18:41
Salut us_30.
Je répond à tes deux messages :
1) factorielle : je vais étudier ton code, car effectivement le type de donnée limite le calcul.
2) la "sommielle". Alors là je suis INEXCUSABLE. C'est évidemment la somme des termes d'une suite arithmétique de raison 1. D'où S=1er terme * dernier terme * nb terme /2.
C'est Euler qui a eu ce raisonnement ?? Je ne me rappelais pas exactement du nom du (futur) mathématicien ayant fait çà à cet âge là, c'est donc Euler... Pour la petite histoire, que tu connais déjà je suppose, Euler s'ennuyait en cours de maths à son âge. (8 ans, donc)
Le professeur, le voyant bavarder, lui donna alors une punition censée l'occuper jusqu'à la fin du cours : faire la somme des 100 premiers nombres : 1+2+3+4+...+99+100. Euler réfléchissa alors, puis écrit le chiffre 1 en face du nombre 100. De même avec 2 et 99, 3 et 98 .... et s'aperçu alors que la somme était toujours de 101. Il donna donc après 1 minute de réfléxion le résultat à son professeur : 100*101/2. Ce dernier fut, on peut l'imaginer, vraiment surpris.
Enfin, concernant mon programme, j'ai pris en compte ta première remarque (celle du 20 novembre) : je compte optimiser. D'ailleurs tu as pu t'apercevoir que mon module est incomplet; je compte le terminer pendant ces vancances. Et l'optimiser par la même occasion.
Le temps me manque, ces derniers temps je n'ai programmé qu'un programme (le jeu de la vie) qui m'a pris à peine 3h le soir du premier jour de mes vacances...
Donc je prend, bien entendu, en compte tes remarques pertinentes, et je posterais une mise à jour (d'ici à la fin de l'année je pense) qui terminera le programme (les fonctions string) et qui améliorera les algos (où, dans le cas de la somielle, les chamboulera complétement !).
Je te remercie us_30 pour tes conseils !
Bonne prog, @+
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 21 déc. 2005 à 18:07
Euh... encore moi... j'ai pas fini...
La fonction Somi, cette fois... Telle que tu la code, elle réalise la somme de 1 jusqu'à Nombre... Or, on peut très facilement remplacer cette fonction, par un calcul direct, au lieu de faire une boucle... En effet, si tu veux connaître la somme de 1+2+3+4+5+6+...+(N-1)+N alors il suffit de regrouper les termes deux par deux en prenant le premier et le dernier, puis le deuxième avec l'avant-dernier, etc... et on voit qu'on peut former (N/2) fois la somme (N+1), soit N*(N+1)/2.
Voilà, ce raisonnement a été tenu par Euler, à l'âge de 8 ans...
Amicalement,
Us.
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 21 déc. 2005 à 17:44
Salut,
Voici qlq remarques supplémentaires.
=
Le calcul de la factorielle n'est pas terrible !
En effet, tu déclares la fonction en type "Long"... Donc tu limites la valeur à renvoyer à 2 147 483 647 ; soit fact(12) car fact(13) dépasse la valeur limite, et renvoi une erreur (gérée)... c'est beaucoup trop peu...
Private Function Fact(Nombre As Double) As Long
... je passe sur le reste du code...
Après réflexion, je pense que pour faire une fonction factorielle la plus efficace possible sans passer par le calcul des nombres de grande taille, donc en restant en Double, qu'il est préférable de coupler ce calcul avec la fonction de Stirling. L'idée c'est de calculer Fact en double en nombre entier jusqu'à la limite de 10^16, puisqu'en suite on aura automatiquement un calcul en puissance (ex : 1E16), il sera plus rapide d'utiliser la formule de stinrling. A noter qu'on dépasse 10^16, pour fact(19). Attention, l'affichage lui peut être en puissance avant, mais la précision du calcul en interne ne sera pas affectée.
Voici ce que cela donne :
=
Function Fact(Nombre As Long) As Double
'fonction de calcul de la factorielle (jusqu'à 170!)
'gestion erreur
On Error GoTo erreur
'Définition
Dim Z As Long
Nombre = Abs(Nombre)
Fact = 1
If Nombre < 18 Then
For Z = 1 To Nombre
Fact = Fact * Z 'on multiplie jusqu'à Nombre
Next Z
Else
Dim K As Double
'K est un terme correctif de l'approximation de stirling
K = 1 + 1 / (12 * Nombre) + 1 / (288 * Nombre ^ 2) _
- 139 / (51480 * Nombre ^ 3) - 571 / (2488320 * Nombre ^ 4) _
+ 163879 / (209018880 * Nombre ^ 5)
Fact = K * Sqr(8 * Atn(1) * Nombre) * (Nombre / Exp(1)) ^ Nombre
End If
MathState = done
Exit Function
erreur:
'erreur (dépassement de capacité)
MathState = impossible
End Function
=
Après vérification, on peut constater qu'on ne peut pas dépassé 170!
Voilà, bon courage.
Amicalement,
Us.
mmptj
Messages postés21Date d'inscriptionmardi 4 mars 2003StatutMembreDernière intervention20 janvier 2009 28 nov. 2005 à 12:10
pour calculer Pi j'utise le calcul suivant:
pi = 4# * Atn(1#)
je ne sais pas si c'est plus précis, c'est plus beau et cela m'évite de connaitre les n decimales de Pi
@+
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 22 nov. 2005 à 20:24
Pas grave, @+
Mikaels35
Messages postés146Date d'inscriptiondimanche 23 janvier 2005StatutMembreDernière intervention17 novembre 20092 22 nov. 2005 à 20:23
Désolé j'étais resté sur ta première source de calculatrice !
@+
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 22 nov. 2005 à 19:36
Mikaels35 ==> Désolé mais tu te plantes complètement. Ici, c'est une source qui donne des fonctions mathématiques et des opérations sur les strings !! Pourquoi tu me parles de notation polonaise et de touche C,Ce,MC ??? Tu crois que ma source est une calculatrice ??
Jette un coup d'oeil au descriptif avant de poster des messages hors-sujet. Merci.
@+
Mikaels35
Messages postés146Date d'inscriptiondimanche 23 janvier 2005StatutMembreDernière intervention17 novembre 20092 22 nov. 2005 à 08:45
"Arcsin(0)=0 ! Je t'assure !
Concernant Sin(Pi), je mettrai un round pour éviter les bugs"
C'est bien ce que je disais, mais je précisais que ArcSin(Sin(Pi)) devait donner 0 aussi mais affiche une erreur de division par 0 !!
"On ne peut pas se sevir des résultats intermédiaires" : tu peux préciser ?? Merci"
Si tu veux faire un calcul avec une fonction: 3^2 + 2 par exemple, le 2 entré après le calcul du log se rajoute à la suite du résultat au lieu de se mettre seul dans l'afficheur pour être traité après !
3 x^2 -> 9
3 x^2 2 + -> 92 ???
En rajoutant un + aprés le calcul de x^2 cela marche mais pas s on utilise une fonction trigo !
3 x^2 + 2 + -> 11
1 Cos -> 0,54030230586814 puis 2 + -> 0,540302305868142
1 Cos -> 0,54030230586814 puis + 2 + -> 2
Tu utilises un mélange de calculs directs et de notation polonaise inversée
Ex si on veut calculer 2+3
2 x 3 = 6 exact
si on enchaine une autre opération 2x3+4:
2 x 3 + 4 = -> 9 faux !
il faut entrer:
2 (o) 3 x 4 + -> 10 exact ! o = opération quelconque
Il vaudrait mieux opter pour la polonaise inversée seule et avoir une touche "Ent" pour valider le 1er nombre entré et pas de touche "=" la dernière opération entrée validant le résultat!
2 Ent 3 x 4 + -> 10
Il y a aussi des problèmes avec les touches C et CE qui réagissent différement dans certains cas !
Il faudrait aussi ue touche d'effacement de la mémoire: "MC"
Bref il y a encore du boulot !!
@+
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 22 nov. 2005 à 08:10
pour te contenter, avec la vraissemblable disparition de l'Enum, la liste peut apparaitre en tapant le nom du module, que tu devrais raccourcir...
si tu tapes :
Module_operations_maths_string. la liste apparaitra...
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 22 nov. 2005 à 00:06
voir code, mais dans la logique pour le nom, ParentFOLDER devrait retourner "ert"
tu devrais nommer ta fonction "ParentPath".
sinon côté math, çà casse un peu... mais l'idée n'est pas mal. je la garde de coté pour un gros module en cours ;)
++ bonne continuation
(toujours pas noté, et je ne compte pas le faire)
PCPT [AFCK]
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 21 nov. 2005 à 23:52
Bonsoir,
Juste une petite précision sur la fonction Gamma. Contrairement à ce que tu crois, la fonction Gamma est définie sur les réels négatifs... enfin sauf pour les nombres entiers négatifs... mais entre ces nombres, il n'y a pas de problème... Si je puis me permettre, cette fonction est présente sur mon modeste site, si cela peut d'inspirer...
Amicalement,
Us.
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 21 nov. 2005 à 22:25
Juste un truc, j'ai mis
Sub main()
MsgBox Calcul(Arccosinus, 0)
End Sub
dans le module.... Faut bien sur l'enlever !
Merci, @+
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 21 nov. 2005 à 21:01
J'avais écrit un big texte, mais bon, je vais résumer :
us_30 ==> je vais optimiser, promis :-)
mikaels35 ==> Si, si ! Arcsin(0)=0 ! Je t'assure !
Concernant Sin(Pi), je mettrai un round pour éviter les bugs
Comprend pas le problème avec les angles. A noter que je renvoie tout en radians.
"On ne peut pas se sevir des résultats intermédiaires" : tu peux préciser ?? Merci
VB Lover ==> je vais raccourcir les noms, si çà te dérange vraiment (mais le enum est là pour que tu ne tappes pas tout:-))
Pour plusieurs fonctions, je sais pas trop... Le but est quand même de tout avoir sous la main (le enum permet de lister facilement les fonctions dispo)
Je vais revoir les domaindes de définition
Renfield ==> "ici, l'appelant verra son nombre altéré..." je comprend pas le pb : Gamma n'est pas définie pour les réels négatifs
Je vais voir pour la fonction unique...
Oui, la déclaration avec tous les mod est mauvaise, mais de toute façon je vais reprendre tou les algos pour les optimiser
Sérieux ???? Le backslash effectue est division en ne gardant que la partie entière ??? Merci bcp pour l'info !!
Je vais essayer de contenter tous le monde. Si vous avez des questions, que vous voulez que j'ajoute des fonctions (aussi pour les string, je le fais en ce moment), dîtes les moi!
Postez vos critiques et remarques !
Merci, @+
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 21 nov. 2005 à 12:02
J'ia des critiques coté perf...
attention au passage de parametres par reference :
Private Function GammaF(Nombre As Double) As Double
[...]
Nombre = Abs(Nombre)
ici, l'appelant verra son nombre altéré...
autre chose, je suis pas trop d'acord pour l'utilisation d'une fonction unique..... coté perf, c'est pas top....vb ne gère certes pas les fonctions Inline, mais le Select Case, et différentes variables déclarée ne sont pas du meilleur effet
attention également a ce genre de déclaration :
If (N Mod 2) 0 Or (N Mod 3) 0 Or (N Mod 5) = 0 Or (N Mod 7) = 0 Or N = 1 Or N = 0 Then Exit Function
toutes les (N Mod x) seront en effet évaluées.
évite les commandes sur une même ligne :
A Fix(Nombre): B Fix(Nombre2): ReDim CalculR(2)
de même, Int(Z / ZZ) sera plus rapide ainsi : Z \ ZZ
Vb Lover
Messages postés221Date d'inscriptionvendredi 30 novembre 2001StatutMembreDernière intervention13 février 20105 21 nov. 2005 à 08:24
juste deux petits commentaires:
1) je trouve en général que les noms des fonctions sont trop longs (ex : arccosinus_hyperbolique pourraît s'appeler ACosH, ou ACosHyp)
2) au lieu de tout mettre dans une fonction "Calcul" et d'utiliser un énorme select case, ça serait mieux de faire plein de fonctions. Toujours avec le même exemple, au lieu d'écrire Y=Calcul(arccosinus_hyperbolique,2), ça deviendrait Y=ACosH(2).
3) les fonctions ont l'air justes en générales, mais il faudrait peut-être vérifier les domaines de définition. Pour l'arccosinus_hyperbolique, c'est en fait le seul que j'ai regardé:), il y a une toute petite faute : ACosH(1) existe et vaut 0. Il faudrait donc changer ton if X<=1 par if X<1
Mikaels35
Messages postés146Date d'inscriptiondimanche 23 janvier 2005StatutMembreDernière intervention17 novembre 20092 21 nov. 2005 à 08:18
Il y a de gros bugs dans les fonctions trigo !
0,Arc, Sin -> 0 normal !
mais Pi, Sin -> 1,22460635382238E-16 normal aussi vu la précision !
puis Arc, Sin -> "Division par 0"
1, Cos -> 0,54030230586814 puis Cos -> 1 et ainsi de suite que ce soit en Rad ou Dgr, mais pas en Gra ou on a toujours 1!
On ne peut pas se sevir des résultats intermédiaires
1, Cos -> 0,54030230586814
si on veut ajouter 2, le 2 se rajoute à la suite du résultat et pas comme un nouveau chiffre !
Il y en a d'autres !!
A revoir donc !
@+
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 20 nov. 2005 à 23:24
Bonsoir,
Gros travail tout de même... Je regarderai plus tard en détail, mais ma question est de savoir si tu penses reprendre aussi le code pour optimiser les calculs... (je noterai plus tard)
Amicalement,
Us.
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 20 nov. 2005 à 16:12
salut,
pense à éviter les accents.
évite l'étiquette "Err", mot-réservé (même si fonctionnel)
(pas noté) @+
PCPT [AFCK]
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 20 nov. 2005 à 15:52
Voilà : Pour toutes questions, suggestions, remarques... --> postez un message !!
@+
21 déc. 2005 à 18:41
Je répond à tes deux messages :
1) factorielle : je vais étudier ton code, car effectivement le type de donnée limite le calcul.
2) la "sommielle". Alors là je suis INEXCUSABLE. C'est évidemment la somme des termes d'une suite arithmétique de raison 1. D'où S=1er terme * dernier terme * nb terme /2.
C'est Euler qui a eu ce raisonnement ?? Je ne me rappelais pas exactement du nom du (futur) mathématicien ayant fait çà à cet âge là, c'est donc Euler... Pour la petite histoire, que tu connais déjà je suppose, Euler s'ennuyait en cours de maths à son âge. (8 ans, donc)
Le professeur, le voyant bavarder, lui donna alors une punition censée l'occuper jusqu'à la fin du cours : faire la somme des 100 premiers nombres : 1+2+3+4+...+99+100. Euler réfléchissa alors, puis écrit le chiffre 1 en face du nombre 100. De même avec 2 et 99, 3 et 98 .... et s'aperçu alors que la somme était toujours de 101. Il donna donc après 1 minute de réfléxion le résultat à son professeur : 100*101/2. Ce dernier fut, on peut l'imaginer, vraiment surpris.
Enfin, concernant mon programme, j'ai pris en compte ta première remarque (celle du 20 novembre) : je compte optimiser. D'ailleurs tu as pu t'apercevoir que mon module est incomplet; je compte le terminer pendant ces vancances. Et l'optimiser par la même occasion.
Le temps me manque, ces derniers temps je n'ai programmé qu'un programme (le jeu de la vie) qui m'a pris à peine 3h le soir du premier jour de mes vacances...
Donc je prend, bien entendu, en compte tes remarques pertinentes, et je posterais une mise à jour (d'ici à la fin de l'année je pense) qui terminera le programme (les fonctions string) et qui améliorera les algos (où, dans le cas de la somielle, les chamboulera complétement !).
Je te remercie us_30 pour tes conseils !
Bonne prog, @+
21 déc. 2005 à 18:07
La fonction Somi, cette fois... Telle que tu la code, elle réalise la somme de 1 jusqu'à Nombre... Or, on peut très facilement remplacer cette fonction, par un calcul direct, au lieu de faire une boucle... En effet, si tu veux connaître la somme de 1+2+3+4+5+6+...+(N-1)+N alors il suffit de regrouper les termes deux par deux en prenant le premier et le dernier, puis le deuxième avec l'avant-dernier, etc... et on voit qu'on peut former (N/2) fois la somme (N+1), soit N*(N+1)/2.
Voilà, ce raisonnement a été tenu par Euler, à l'âge de 8 ans...
Amicalement,
Us.
21 déc. 2005 à 17:44
Voici qlq remarques supplémentaires.
=
Le calcul de la factorielle n'est pas terrible !
En effet, tu déclares la fonction en type "Long"... Donc tu limites la valeur à renvoyer à 2 147 483 647 ; soit fact(12) car fact(13) dépasse la valeur limite, et renvoi une erreur (gérée)... c'est beaucoup trop peu...
Private Function Fact(Nombre As Double) As Long
... je passe sur le reste du code...
Après réflexion, je pense que pour faire une fonction factorielle la plus efficace possible sans passer par le calcul des nombres de grande taille, donc en restant en Double, qu'il est préférable de coupler ce calcul avec la fonction de Stirling. L'idée c'est de calculer Fact en double en nombre entier jusqu'à la limite de 10^16, puisqu'en suite on aura automatiquement un calcul en puissance (ex : 1E16), il sera plus rapide d'utiliser la formule de stinrling. A noter qu'on dépasse 10^16, pour fact(19). Attention, l'affichage lui peut être en puissance avant, mais la précision du calcul en interne ne sera pas affectée.
Voici ce que cela donne :
=
Function Fact(Nombre As Long) As Double
'fonction de calcul de la factorielle (jusqu'à 170!)
'gestion erreur
On Error GoTo erreur
'Définition
Dim Z As Long
Nombre = Abs(Nombre)
Fact = 1
If Nombre < 18 Then
For Z = 1 To Nombre
Fact = Fact * Z 'on multiplie jusqu'à Nombre
Next Z
Else
Dim K As Double
'K est un terme correctif de l'approximation de stirling
K = 1 + 1 / (12 * Nombre) + 1 / (288 * Nombre ^ 2) _
- 139 / (51480 * Nombre ^ 3) - 571 / (2488320 * Nombre ^ 4) _
+ 163879 / (209018880 * Nombre ^ 5)
Fact = K * Sqr(8 * Atn(1) * Nombre) * (Nombre / Exp(1)) ^ Nombre
End If
MathState = done
Exit Function
erreur:
'erreur (dépassement de capacité)
MathState = impossible
End Function
=
Après vérification, on peut constater qu'on ne peut pas dépassé 170!
Voilà, bon courage.
Amicalement,
Us.
28 nov. 2005 à 12:10
pi = 4# * Atn(1#)
je ne sais pas si c'est plus précis, c'est plus beau et cela m'évite de connaitre les n decimales de Pi
@+
22 nov. 2005 à 20:24
22 nov. 2005 à 20:23
@+
22 nov. 2005 à 19:36
Jette un coup d'oeil au descriptif avant de poster des messages hors-sujet. Merci.
@+
22 nov. 2005 à 08:45
Concernant Sin(Pi), je mettrai un round pour éviter les bugs"
C'est bien ce que je disais, mais je précisais que ArcSin(Sin(Pi)) devait donner 0 aussi mais affiche une erreur de division par 0 !!
"On ne peut pas se sevir des résultats intermédiaires" : tu peux préciser ?? Merci"
Si tu veux faire un calcul avec une fonction: 3^2 + 2 par exemple, le 2 entré après le calcul du log se rajoute à la suite du résultat au lieu de se mettre seul dans l'afficheur pour être traité après !
3 x^2 -> 9
3 x^2 2 + -> 92 ???
En rajoutant un + aprés le calcul de x^2 cela marche mais pas s on utilise une fonction trigo !
3 x^2 + 2 + -> 11
1 Cos -> 0,54030230586814 puis 2 + -> 0,540302305868142
1 Cos -> 0,54030230586814 puis + 2 + -> 2
Tu utilises un mélange de calculs directs et de notation polonaise inversée
Ex si on veut calculer 2+3
2 x 3 = 6 exact
si on enchaine une autre opération 2x3+4:
2 x 3 + 4 = -> 9 faux !
il faut entrer:
2 (o) 3 x 4 + -> 10 exact ! o = opération quelconque
Il vaudrait mieux opter pour la polonaise inversée seule et avoir une touche "Ent" pour valider le 1er nombre entré et pas de touche "=" la dernière opération entrée validant le résultat!
2 Ent 3 x 4 + -> 10
Il y a aussi des problèmes avec les touches C et CE qui réagissent différement dans certains cas !
Il faudrait aussi ue touche d'effacement de la mémoire: "MC"
Bref il y a encore du boulot !!
@+
22 nov. 2005 à 08:10
si tu tapes :
Module_operations_maths_string. la liste apparaitra...
22 nov. 2005 à 00:06
commentaires :
'Exemple: ParentFolder("c:\aze\ert\tyui","",true)="c:\aze\ert"
voir code, mais dans la logique pour le nom, ParentFOLDER devrait retourner "ert"
tu devrais nommer ta fonction "ParentPath".
sinon côté math, çà casse un peu... mais l'idée n'est pas mal. je la garde de coté pour un gros module en cours ;)
++ bonne continuation
(toujours pas noté, et je ne compte pas le faire)
PCPT [AFCK]
21 nov. 2005 à 23:52
Juste une petite précision sur la fonction Gamma. Contrairement à ce que tu crois, la fonction Gamma est définie sur les réels négatifs... enfin sauf pour les nombres entiers négatifs... mais entre ces nombres, il n'y a pas de problème... Si je puis me permettre, cette fonction est présente sur mon modeste site, si cela peut d'inspirer...
Amicalement,
Us.
21 nov. 2005 à 22:25
Sub main()
MsgBox Calcul(Arccosinus, 0)
End Sub
dans le module.... Faut bien sur l'enlever !
Merci, @+
21 nov. 2005 à 21:01
us_30 ==> je vais optimiser, promis :-)
mikaels35 ==> Si, si ! Arcsin(0)=0 ! Je t'assure !
Concernant Sin(Pi), je mettrai un round pour éviter les bugs
Comprend pas le problème avec les angles. A noter que je renvoie tout en radians.
"On ne peut pas se sevir des résultats intermédiaires" : tu peux préciser ?? Merci
VB Lover ==> je vais raccourcir les noms, si çà te dérange vraiment (mais le enum est là pour que tu ne tappes pas tout:-))
Pour plusieurs fonctions, je sais pas trop... Le but est quand même de tout avoir sous la main (le enum permet de lister facilement les fonctions dispo)
Je vais revoir les domaindes de définition
Renfield ==> "ici, l'appelant verra son nombre altéré..." je comprend pas le pb : Gamma n'est pas définie pour les réels négatifs
Je vais voir pour la fonction unique...
Oui, la déclaration avec tous les mod est mauvaise, mais de toute façon je vais reprendre tou les algos pour les optimiser
Sérieux ???? Le backslash effectue est division en ne gardant que la partie entière ??? Merci bcp pour l'info !!
Je vais essayer de contenter tous le monde. Si vous avez des questions, que vous voulez que j'ajoute des fonctions (aussi pour les string, je le fais en ce moment), dîtes les moi!
Postez vos critiques et remarques !
Merci, @+
21 nov. 2005 à 12:02
attention au passage de parametres par reference :
Private Function GammaF(Nombre As Double) As Double
[...]
Nombre = Abs(Nombre)
ici, l'appelant verra son nombre altéré...
autre chose, je suis pas trop d'acord pour l'utilisation d'une fonction unique..... coté perf, c'est pas top....vb ne gère certes pas les fonctions Inline, mais le Select Case, et différentes variables déclarée ne sont pas du meilleur effet
attention également a ce genre de déclaration :
If (N Mod 2) 0 Or (N Mod 3) 0 Or (N Mod 5) = 0 Or (N Mod 7) = 0 Or N = 1 Or N = 0 Then Exit Function
toutes les (N Mod x) seront en effet évaluées.
évite les commandes sur une même ligne :
A Fix(Nombre): B Fix(Nombre2): ReDim CalculR(2)
de même, Int(Z / ZZ) sera plus rapide ainsi : Z \ ZZ
21 nov. 2005 à 08:24
1) je trouve en général que les noms des fonctions sont trop longs (ex : arccosinus_hyperbolique pourraît s'appeler ACosH, ou ACosHyp)
2) au lieu de tout mettre dans une fonction "Calcul" et d'utiliser un énorme select case, ça serait mieux de faire plein de fonctions. Toujours avec le même exemple, au lieu d'écrire Y=Calcul(arccosinus_hyperbolique,2), ça deviendrait Y=ACosH(2).
3) les fonctions ont l'air justes en générales, mais il faudrait peut-être vérifier les domaines de définition. Pour l'arccosinus_hyperbolique, c'est en fait le seul que j'ai regardé:), il y a une toute petite faute : ACosH(1) existe et vaut 0. Il faudrait donc changer ton if X<=1 par if X<1
21 nov. 2005 à 08:18
0,Arc, Sin -> 0 normal !
mais Pi, Sin -> 1,22460635382238E-16 normal aussi vu la précision !
puis Arc, Sin -> "Division par 0"
1, Cos -> 0,54030230586814 puis Cos -> 1 et ainsi de suite que ce soit en Rad ou Dgr, mais pas en Gra ou on a toujours 1!
On ne peut pas se sevir des résultats intermédiaires
1, Cos -> 0,54030230586814
si on veut ajouter 2, le 2 se rajoute à la suite du résultat et pas comme un nouveau chiffre !
Il y en a d'autres !!
A revoir donc !
@+
20 nov. 2005 à 23:24
Gros travail tout de même... Je regarderai plus tard en détail, mais ma question est de savoir si tu penses reprendre aussi le code pour optimiser les calculs... (je noterai plus tard)
Amicalement,
Us.
20 nov. 2005 à 16:12
pense à éviter les accents.
évite l'étiquette "Err", mot-réservé (même si fonctionnel)
(pas noté) @+
PCPT [AFCK]
20 nov. 2005 à 15:52
@+