MODULE DE CALCUL MATHÉMATIQUES/STRING DIVERS

violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 - 20 nov. 2005 à 15:52
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 - 21 déc. 2005 à 18:41
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/34722-module-de-calcul-mathematiques-string-divers

violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
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és 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
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és 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
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és 21 Date d'inscription mardi 4 mars 2003 Statut Membre Dernière intervention 20 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és 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
22 nov. 2005 à 20:24
Pas grave, @+
Mikaels35 Messages postés 146 Date d'inscription dimanche 23 janvier 2005 Statut Membre Dernière intervention 17 novembre 2009 2
22 nov. 2005 à 20:23
Désolé j'étais resté sur ta première source de calculatrice !

@+
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
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és 146 Date d'inscription dimanche 23 janvier 2005 Statut Membre Dernière intervention 17 novembre 2009 2
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és 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
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és 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
22 nov. 2005 à 00:06
salut,

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]
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
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és 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
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és 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
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és 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
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és 221 Date d'inscription vendredi 30 novembre 2001 Statut Membre Dernière intervention 13 février 2010 5
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és 146 Date d'inscription dimanche 23 janvier 2005 Statut Membre Dernière intervention 17 novembre 2009 2
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és 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
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és 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
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és 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
20 nov. 2005 à 15:52
Voilà : Pour toutes questions, suggestions, remarques... --> postez un message !!
@+
Rejoignez-nous