|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||||||||
MED RIDA BELLAMINEIngénieur développement logiciels Inscription : février 2012 Messages : 31 ![]() |
*BONJOUR*,
je suis entrain de développer un logiciel de calcul scientifique en VBA sous EXCEL2007 mais j'ai rencontré un problème majeur qui risque de mettre en cause tous les logiciels développés en VBA. J'essai de résumé se problème à travers ce qui suit: 1 - Créant la fonction personnalisée suivante en VBA sous EXCEL Code :
Malheureusement le résultat renvoyer par TOTO est Faux ce qui n'est pas normal 2 - Recherche de la différence entre alpha et x En recherchant la différence entre alpha et x en modifiant la fonction personalisée comme suit : Code :
D'où vient alors cette différence c'est ici la question???? 3 - modification du processus de calcul de la fonction personnalisée En modifiant le processus de calcul de la fonction TOTO comme suit : Code :
De même en peut modifier le processus de calcul d'une autre manière comme suit: Code :
entre deux variables numériques. Si ce test ne s'exécute pas correctement comme en la vue ci dessus tous les logiciels développés en VBA seront mis en cause. Que faire alors ? C'est un problème de fond |
||||||||
|
|
02
|
|
|
#2 |
![]() ![]() ![]() Fabrice CONSTANSIngénieur développement logiciels Inscription : avril 2005 Messages : 7 090 ![]() |
Bonjour,
ça résoud le problème. C'est le problème des approximations. Cordialement, A noter également que VB n'a pas vocation à faire du calcul scientifique.
__________________
Classe MELA(CRUD) Opérateur IN et zone de liste MsGraph et VBA - 1e Partie 2e partie Entête d'états-Opérateur LIKE-Evénements formulaires-Cours 2010 Complément :Générateur de msgbox Visitez mon Blog Les questions techniques par MP ne sont pas lues et je ne pratique pas l'extispicine |
|
20
|
|
|
#3 | |
MED RIDA BELLAMINEIngénieur développement logiciels Inscription : février 2012 Messages : 31 ![]() |
Citation:
Quelle est la différence si j’utilise If Val(alpha)=val(x) au lieu de If WorksheetFunction.RoundDown(alpha - x, 10) = 0. Combien de chiffres après la virgule prend l’instruction Val( ) pour comparer alpha à x ? Aussi, je ne suis pas d’accord avec toi sur votre opinion où VB n’a pas vocation à faire du calcul scientifique pour les raisons suivantes : - Qu’est ce qu’un calcul scientifique ? : tout simplement c’est un procéder qui utilise les opérateurs + , - , / , * , ect… pour aboutir à une valeur alphanumérique reconnue sous le nom de résultat. Le langage VB mais à la disposition de l’utilisateur tout un package d’instructions de calcul scientifique tel que le calcul matriciel, fonctions logarithmiques, fonction exponentiels, fonctions statistiques, fonction de la logique mathématique etc… Ce package d’instructions ne fait qu’utiliser les opérateurs sus cités pour renvoyer un résultat fiable c’est donc bien un calcul scientifique. - Si VB est un langage de programmation objets il ne faut pas oublier que derrière ces objets il y a un staff de procédures qui s’exécutent en utilisant les opérateurs de calcul scientifique et pas mal de choses pour renvoyer l’objet attendu. Par exemple si vous comparer deux variables de type objet if objet1=objet2 où de type numérique if valeur1 = valeur2 vous avez utilisé l’opérateur = qui n’est autre que l’opérateur de source purement scientifique. Le problème que j’ai mis en discussion n’a rien n’avoir avec le calcul scientifique mais plutôt et c’est là le problématique la fiabilité du résultat attendu. Maintenant, supposant que votre opinion est VRAIE et laissant le langage VB de coté. Revenant à EXCEL : c’est bien outil de calcul scientifique du moment où il mais à notre disposition tout un package de fonctions mathématiques avec lesquelles ont peut créer une variété de feuille de calcul scientifique. Alors Ouvrant un classeur EXCEL : (voir classeur TOTO en pièce jointe à la présente note de réponse pour discussion) Saisissant les valeurs numériques de 0 à 3 par pas de 0.15 dans la colonne C de la cellule C4 à C24 je dis bien saisissant se sont des valeurs d’entrée c.à.d. les données du problème. Dans la cellule I4 saisissant la valeur -16.5 dans la cellule I5 introduisant la formule suivante =I4+0.15 pour obtenir les formules des cellules I6 à I24 faite glissé la formule de la cellule I5 jusqu’au I24 Les formules des colonnes H, G, F, E et D depuis la ligne 4 jusqu‘au la ligne 24 s’obtiennent comme suit : - La colonne H = la colonne I+4.5 - La colonne G = la colonne H+1.5 - La colonne F = la colonne G+4.5 - La colonne E = la colonne F+4.5 - La colonne D = la colonne E+1.5 Maintenant faisant le test d’égalité entre les valeurs des colonnes C et D et le test de la différence éventuellement. Je vous renvoi au classeur ci-joint pour de plus amples détails. La conclusion : on a fait un calcul scientifique moyennant un outil informatique de calcul scientifique en utilisant des valeurs numériques à seulement deux chiffres après la virgule; le problème persiste Quelle est la source en langage informatique proprement dit à l’origine de cette erreur de calcul ? En utilisant seulement des valeurs numériques à deux chiffres après la virgule EXCEL fait des calculs en rajoutant des epsilons pourquoi ? Comment peut ont justifié le surplus des epsilons dans les calculs ? Cordialement |
|
|
|
12
|
|
|
#4 | |
![]() ![]() ![]() Fabrice CONSTANSIngénieur développement logiciels Inscription : avril 2005 Messages : 7 090 ![]() |
Bonjour,
Il ne faut pas tout mélanger. Excel est a VBA ce que le Saucisson est au Pain. Juste un accompagnant. La règle qui veut que le langage qui a servi à écrire VBA permet le calcul sc. donc VBA le permet est fausse. C'est de la pure logique. Citation:
Val vs. Rounddown : Val est une instruction purement VBA donc la méthode est applicable à l'ensemble des produits utilisant ce langage sans chargement de bibliothèque. Il y a surement un gain en temps machine. Dans l'exemple c'est purement anecdotique. Pour répondre à toutes les questions que tu te poses sur les epsi. il te faut te renseigner sur les spécificités du type Double. Connaitre les types natifs c'est la base de la programmation. Cordialement,
__________________
Classe MELA(CRUD) Opérateur IN et zone de liste MsGraph et VBA - 1e Partie 2e partie Entête d'états-Opérateur LIKE-Evénements formulaires-Cours 2010 Complément :Générateur de msgbox Visitez mon Blog Les questions techniques par MP ne sont pas lues et je ne pratique pas l'extispicine |
|
|
00
|
|
|
#5 | |
MED RIDA BELLAMINEIngénieur développement logiciels Inscription : février 2012 Messages : 31 ![]() |
Citation:
j'ai testé l'instruction elle ne fait que comparer deux variables numériques à 14 chiffres après la virgule c'est juste le seuil inférieur de l'erreur que commit EXCEL et VB. C'est une sorte d'équivalence de l'instruction Code :
WorksheetFunction.RoundDown(number, 14) |
|
|
|
00
|
|
|
#6 | ||
|
Expert Confirmé Sénior
![]() Inscription : juillet 2008 Messages : 5 848 ![]() |
Autrement
Au lieu de tester une égalité sur des doubles , mettre une inégalité avec choix de l'approximation Code :
__________________
Cordialement. |
||
|
|
10
|
|
|
#7 |
MED RIDA BELLAMINEIngénieur développement logiciels Inscription : février 2012 Messages : 31 ![]() |
BONSOIR,
Il ne s'agit pas d'un problème de test d'égalité sur des doubles, même si les variables X et Y sont de type single ou variant le problème persiste. La notion de double ou single d'une variable de type numérique est identique à celle quant utilisait en langage FORTRAN. Pourquoi en langage FORTRAN ont n'avait pas de problème avec les doubles et singles. Cette notion de double et single a été introduite à l'époque dans un objectif de gain de l'espace mémoire qui est dépassé actuellement (les ordinateurs de la nouvelle génération tournent avec 4 processeurs et des multitâches). En langage Pascal ou Turbo Pascal plus évoluer que le Fortran la notion des doubles et single a été supprimée et remplacée par du type réelle. je vais essayé d'exécuter le code avec le langage Turbo Pascal pour voir est ce un problème de langage où un problème lié au système. Maintenant, même si on arrive à résoudre le problème du teste d'égalité des deux variables X et Y par votre astuce ou par l'astuce de monsieur loufab ou autres rien ne nous garantie ce qui se passe à l'intérieur des instructions qui se trouvent entre le IF et END IF du moment où l'une des deux variables X et Y retient une valeur erronée. A SUIVRE Cordialement |
|
|
01
|
|
|
#8 | |
|
Expert Confirmé Sénior
![]() Inscription : juillet 2008 Messages : 5 848 ![]() |
Je te propose un premier lien qui permettrait de distinguer chaque type de donnée (notamment ceux à virgule flottante et les arrondis qui en découlent)
http://msdn.microsoft.com/fr-fr/libr...=vs.80%29.aspx Et fais une recherche sur les opérations sur les nombres à virgule flottante. http://perso.ens-lyon.fr/jean-michel...CoursVF-4p.pdf Citation:
C'est comme si tu veux matérialiser (physiquement) un nombre réel avec une approximation infinie.
__________________
Cordialement. |
|
|
|
40
|
|
|
#9 | |
![]() ![]() Didier GONARDFormateur Développeur Office - indépendant Inscription : février 2008 Messages : 2 353 ![]() |
Citation:
![]() -
__________________
Didier Gonard Ps : Pour noter positivement ou négativement un post, vous pouvez cliquer sur les pouces en bas à droite ! Tutoriels : Voir la liste de mes tutoriels et mon site pro sur ma Page DVP N'oubliez pas de mettre : ..quand c'est le cas !
|
|
|
|
10
|
|
|
#10 | |
MED RIDA BELLAMINEIngénieur développement logiciels Inscription : février 2012 Messages : 31 ![]() |
Citation:
|
|
|
|
00
|
|
|
#11 |
|
Expert Confirmé Sénior
![]() Inscription : juillet 2008 Messages : 5 848 ![]() |
Si x appartient à R, il sera représenté par x* avec une précision Epsilon. C'est à dire |x-x*|<=Epsilon
Pi en réalité 3,141592653589793238462.. Pi sera représenté par 3.141592653589790000 0000
__________________
Cordialement. |
|
|
20
|
|
|
#12 |
MED RIDA BELLAMINEIngénieur développement logiciels Inscription : février 2012 Messages : 31 ![]() |
Bonjour,
OUI votre raisonnement est tout à fait logique quant à la représentativité de x par x* mais qu'en est il du nouveau né |x-x*|? normalement il devra être représenté par un ZERO et par conséquent l'instruction reçoit la valeur True ce qui n'est pas le cas. A notre niveau nous les humains on n'a pas de problème avec les nombres le problème est au niveau de la machine. Il faut rectifier cette représentativité de |x-x*| au niveau de la machine. En fin, je vous pris de bien vouloir consulté mon nouveau sujet encours de préparation sur la fonction qui revoie la partie entière d'un nombre tel que définie par VB un problématique de classe. |
|
|
01
|
|
|
#13 |
|
Expert Confirmé Sénior
![]() Inscription : juillet 2008 Messages : 5 848 ![]() |
Relisez le document mis plus haut concernant les nombres à virgule flottante.
__________________
Cordialement. |
|
|
20
|
|
|
#14 | |||||||
MED RIDA BELLAMINEIngénieur développement logiciels Inscription : février 2012 Messages : 31 ![]() |
Citation:
c'est très intéressant comme document je vous remercie infiniment Citation:
j'ai utilisé votre proposition relative à instruction mais malheureusement je me suit confronté avec un autre problème comme suit : est Vraie seulement pour les 290 itérations de l'instruction For : [code] Code :
Par contre on peut aller jusqu'au seuil de l'instruction For qu'est 30000 itérations en modifiant la fonction TOTO comme suit : [code] Code :
Cordialement Citation:
Quelle valeur alors peut on donnée à la précision Epsilon : 10 ^ -14 ou une valeur supérieure "l'erreur est cumulative" ? Je vous prie de bien vouloir consulter ma citation que j'ai envoyé ce jour à Monsieur loufab |
|||||||
|
|
00
|
|
|
#15 | ||
|
Expert Confirmé Sénior
![]() Inscription : juillet 2008 Messages : 5 848 ![]() |
Citation:
Citation:
http://jfpc2010.greyc.fr/articles/26.pdf
__________________
Cordialement. |
||
|
|
10
|
|
|
#16 | ||||
MED RIDA BELLAMINEIngénieur développement logiciels Inscription : février 2012 Messages : 31 ![]() |
Bonjour,
je vous remercie bcp sur le lien de l'article en question Pour trancher et pouvoir progresser dans mon travail de développement. J'ai développé une fonction personnalisée à l’intérieure de mon programme qui me permet de comparer deux variables x et y de type double précision avec une erreur d'approximation Epsilon = 10^-10 largement suffisante pour mon cas. Je vous soumis ci après le code de cette fonction en vous prions de bien vouloir que vous me donner vos remarques et suggestions. Voici le code : Code :
Code :
|
||||
|
|
00
|
|
|
#17 | ||
|
Expert Confirmé Sénior
![]() Inscription : juillet 2008 Messages : 5 848 ![]() |
Je ne comprends pas le cas >= et <= !!
Pour la fonction, elle peut être écrite comme ceci et en retour tu as un booléen Code :
__________________
Cordialement. |
||
|
|
20
|
|
|
#18 | ||
MED RIDA BELLAMINEIngénieur développement logiciels Inscription : février 2012 Messages : 31 ![]() |
Bonjour,
Merci pour votre suggestion efficace. >= et <= ça veut dire respectivement si x est inférieure ou égale à y et si x est supérieure ou égale à y Aussi, on peut suggérer le code comme suit : Code :
En laissant ainsi au développeur de choisir la valeur de Epsilon suivant le cas juger par lui même. Cordialement |
||
|
|
00
|
|
|
#19 | ||
|
Expert Confirmé Sénior
![]() Inscription : juillet 2008 Messages : 5 848 ![]() |
On peut pas écrire la fonction comme tu l'as écrite.
Sinon, une proposition est de mettre Epsilon en étant paramètre optionnel Code :
Precision_Approche(123, 122.999999999, "="), Prend l'Epsilon par défaut (10^-10) Precision_Approche(123, 122.999999999, "=", 0.00000001), Prend l'Epsilon imposé
__________________
Cordialement. |
||
|
|
20
|
|
|
#20 | ||
MED RIDA BELLAMINEIngénieur développement logiciels Inscription : février 2012 Messages : 31 ![]() |
Bonjour,
Maintenant je n'ai plus de soucis pour les poussières à virgules flottantes. Mon problème est résolut. Cordialement Bonjour, pour ne pas alourdir l'écriture du code on peut généraliser comme suit : Code :
Cordialement |
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com