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
1
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
1
22 nov. 2005 à 20:24
Pas grave, @+
Afficher les 19 commentaires