"ng" a écrit dans le message de
news:Salut,
Je ne connais pas Delphi, a quoi correspond exactement le type
extended (si c'est un type) ?
Sinon si c'est du variant, j'aurais plutot fais ca :
Private Declare Sub TerreRef Lib "terredll.dll" (ByRef jd as
variant, ByVal x0 as variant, ByVal y0 as variant, ByVal z0 as
variant, ByVal vx0 as variant, ByVal vy0 as variant, ByVal vz0 As
Variant)
Extended est un type de données, c'est un genre de super Double de
la mort, codé sur 10 octets (rien que ça...) et qui peut
prendre des valeurs assez intéressantes: de -3.4 * 10^4932 à +
1.1 * 10^4932 si j'ai bien compris. Sais pas trop dans quoi
mapper ça en fait. Je suppose que le mieux c'est dans un double VB,
mais suis pas sur que ça colle cette affaire là...
"ng" <ng@ngsoft-fr.com> a écrit dans le message de
news:e7A9Pk1yEHA.2692@TK2MSFTNGP10.phx.gbl...
Salut,
Je ne connais pas Delphi, a quoi correspond exactement le type
extended (si c'est un type) ?
Sinon si c'est du variant, j'aurais plutot fais ca :
Private Declare Sub TerreRef Lib "terredll.dll" (ByRef jd as
variant, ByVal x0 as variant, ByVal y0 as variant, ByVal z0 as
variant, ByVal vx0 as variant, ByVal vy0 as variant, ByVal vz0 As
Variant)
Extended est un type de données, c'est un genre de super Double de
la mort, codé sur 10 octets (rien que ça...) et qui peut
prendre des valeurs assez intéressantes: de -3.4 * 10^4932 à +
1.1 * 10^4932 si j'ai bien compris. Sais pas trop dans quoi
mapper ça en fait. Je suppose que le mieux c'est dans un double VB,
mais suis pas sur que ça colle cette affaire là...
"ng" a écrit dans le message de
news:Salut,
Je ne connais pas Delphi, a quoi correspond exactement le type
extended (si c'est un type) ?
Sinon si c'est du variant, j'aurais plutot fais ca :
Private Declare Sub TerreRef Lib "terredll.dll" (ByRef jd as
variant, ByVal x0 as variant, ByVal y0 as variant, ByVal z0 as
variant, ByVal vx0 as variant, ByVal vy0 as variant, ByVal vz0 As
Variant)
Extended est un type de données, c'est un genre de super Double de
la mort, codé sur 10 octets (rien que ça...) et qui peut
prendre des valeurs assez intéressantes: de -3.4 * 10^4932 à +
1.1 * 10^4932 si j'ai bien compris. Sais pas trop dans quoi
mapper ça en fait. Je suppose que le mieux c'est dans un double VB,
mais suis pas sur que ça colle cette affaire là...
J'ai récupéré une DLL dont j'ai la source. Il y est écrit :
procedure TerreRef(jd:extended;var x0,y0,z0,vx0,vy0,vz0:extended); stdcall;
J'ai mis la DLL dans le répertoire de mon projet, et j'écris en VB :
Private Declare Sub TerreRef Lib "terredll.dll" _
(ByRef jd as variant, ByVal x0, y0, z0, vx0, vy0, vz0 As Variant)
puis dans le code : Call TerreRef(jd,...)
Cela vous paraît-il correct ?
Le logiciel plante avec arrêt de VB :
AppName: vb5.exe AppVer: 5.0.37.24 ModName: terredll.dll
ModVer: 0.0.0.0 Offset: 0008e73f
Je ne sais pas si c'est la DLL ou ma déclaration qui fait planter.
J'ai récupéré une DLL dont j'ai la source. Il y est écrit :
procedure TerreRef(jd:extended;var x0,y0,z0,vx0,vy0,vz0:extended); stdcall;
J'ai mis la DLL dans le répertoire de mon projet, et j'écris en VB :
Private Declare Sub TerreRef Lib "terredll.dll" _
(ByRef jd as variant, ByVal x0, y0, z0, vx0, vy0, vz0 As Variant)
puis dans le code : Call TerreRef(jd,...)
Cela vous paraît-il correct ?
Le logiciel plante avec arrêt de VB :
AppName: vb5.exe AppVer: 5.0.37.24 ModName: terredll.dll
ModVer: 0.0.0.0 Offset: 0008e73f
Je ne sais pas si c'est la DLL ou ma déclaration qui fait planter.
J'ai récupéré une DLL dont j'ai la source. Il y est écrit :
procedure TerreRef(jd:extended;var x0,y0,z0,vx0,vy0,vz0:extended); stdcall;
J'ai mis la DLL dans le répertoire de mon projet, et j'écris en VB :
Private Declare Sub TerreRef Lib "terredll.dll" _
(ByRef jd as variant, ByVal x0, y0, z0, vx0, vy0, vz0 As Variant)
puis dans le code : Call TerreRef(jd,...)
Cela vous paraît-il correct ?
Le logiciel plante avec arrêt de VB :
AppName: vb5.exe AppVer: 5.0.37.24 ModName: terredll.dll
ModVer: 0.0.0.0 Offset: 0008e73f
Je ne sais pas si c'est la DLL ou ma déclaration qui fait planter.
Sans vouloir trop polémiquer le VB n'est pas aussi bien que Delphi
pour les applications scientifiques.
Sans vouloir trop polémiquer le VB n'est pas aussi bien que Delphi
pour les applications scientifiques.
Sans vouloir trop polémiquer le VB n'est pas aussi bien que Delphi
pour les applications scientifiques.
christophe-pasde<> @wanadoo.fr>" < wrote:Sans vouloir trop polémiquer le VB n'est pas aussi bien que Delphi
pour les applications scientifiques.
Ce n'est pas de la polémique. C'est la réalité. Je n'aurais pas a priori
le réflexe, sauf contrainte particulière, d'utiliser VB6 pour une appli
scientifique fortement demandeuse de calculs. Delphi, C, C++,
Fortran,... Quoique le problème est plutôt au niveau des types que des
performances. Quand on fait des calculs, la runtime VB est tout de suite
très proche de la CPU et l'impact de cette couche intermédiaire reste
souvent très relatif. Par exemple, un benchmark comparant VB6 et VB .Net
sur un calcul de nombre premiers montre des écarts très faibles
(attention, je ne suis pas en train de dire que VB .Net a les mêmes
performances que VB6 - ce serait tout à fait ridicule).
christophe-pasde<> @wanadoo.fr>" < wrote:
Sans vouloir trop polémiquer le VB n'est pas aussi bien que Delphi
pour les applications scientifiques.
Ce n'est pas de la polémique. C'est la réalité. Je n'aurais pas a priori
le réflexe, sauf contrainte particulière, d'utiliser VB6 pour une appli
scientifique fortement demandeuse de calculs. Delphi, C, C++,
Fortran,... Quoique le problème est plutôt au niveau des types que des
performances. Quand on fait des calculs, la runtime VB est tout de suite
très proche de la CPU et l'impact de cette couche intermédiaire reste
souvent très relatif. Par exemple, un benchmark comparant VB6 et VB .Net
sur un calcul de nombre premiers montre des écarts très faibles
(attention, je ne suis pas en train de dire que VB .Net a les mêmes
performances que VB6 - ce serait tout à fait ridicule).
christophe-pasde<> @wanadoo.fr>" < wrote:Sans vouloir trop polémiquer le VB n'est pas aussi bien que Delphi
pour les applications scientifiques.
Ce n'est pas de la polémique. C'est la réalité. Je n'aurais pas a priori
le réflexe, sauf contrainte particulière, d'utiliser VB6 pour une appli
scientifique fortement demandeuse de calculs. Delphi, C, C++,
Fortran,... Quoique le problème est plutôt au niveau des types que des
performances. Quand on fait des calculs, la runtime VB est tout de suite
très proche de la CPU et l'impact de cette couche intermédiaire reste
souvent très relatif. Par exemple, un benchmark comparant VB6 et VB .Net
sur un calcul de nombre premiers montre des écarts très faibles
(attention, je ne suis pas en train de dire que VB .Net a les mêmes
performances que VB6 - ce serait tout à fait ridicule).
Oui quand on a la chance de connaitre plusieurs langages,
Pour moi qui programme en amateur dans un cadre professionel (si ça
existe), j'ai fait avec ce que j'avais ...
A ce sujet je cherche un lien ou des explications pour démontrer à mes
employeurs, que le nombre de chiffres après la virgule n'est pas le
nombre de digit significatifs.
Oui quand on a la chance de connaitre plusieurs langages,
Pour moi qui programme en amateur dans un cadre professionel (si ça
existe), j'ai fait avec ce que j'avais ...
A ce sujet je cherche un lien ou des explications pour démontrer à mes
employeurs, que le nombre de chiffres après la virgule n'est pas le
nombre de digit significatifs.
Oui quand on a la chance de connaitre plusieurs langages,
Pour moi qui programme en amateur dans un cadre professionel (si ça
existe), j'ai fait avec ce que j'avais ...
A ce sujet je cherche un lien ou des explications pour démontrer à mes
employeurs, que le nombre de chiffres après la virgule n'est pas le
nombre de digit significatifs.
christophe-pasde<> @wanadoo.fr>" < wrote:Oui quand on a la chance de connaitre plusieurs langages,
Pou .r moi qui programme en amateur dans un cadre professionel (si ça
existe), j'ai fait avec ce que j'avais ...
Oui, j'ai souvent en cours des gens dans votre situation. Ce n'est pas une
critique. Mais si on vous demande d'écrire un tel logiciel, il serait bon
que l'on vous donne les moyens de le faire avec les bons outils.A ce sujet je cherche un lien ou des explications pour démontrer à mes
employeurs, que le nombre de chiffres après la virgule n'est pas le
nombre de digit significatifs.
Cela a besoin d'être démontré? :-)
http://www.cs.utah.edu/%7Ezachary/isp/applets/FP/FP.html
http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/overview/reals.html
http://www.delorie.com/gnu/docs/glibc/libc_195.html
Google devrait vous aider à trouver d'autres pages similaires.
--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
christophe-pasde<> @wanadoo.fr>" < wrote:
Oui quand on a la chance de connaitre plusieurs langages,
Pou .r moi qui programme en amateur dans un cadre professionel (si ça
existe), j'ai fait avec ce que j'avais ...
Oui, j'ai souvent en cours des gens dans votre situation. Ce n'est pas une
critique. Mais si on vous demande d'écrire un tel logiciel, il serait bon
que l'on vous donne les moyens de le faire avec les bons outils.
A ce sujet je cherche un lien ou des explications pour démontrer à mes
employeurs, que le nombre de chiffres après la virgule n'est pas le
nombre de digit significatifs.
Cela a besoin d'être démontré? :-)
http://www.cs.utah.edu/%7Ezachary/isp/applets/FP/FP.html
http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/overview/reals.html
http://www.delorie.com/gnu/docs/glibc/libc_195.html
Google devrait vous aider à trouver d'autres pages similaires.
--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
christophe-pasde<> @wanadoo.fr>" < wrote:Oui quand on a la chance de connaitre plusieurs langages,
Pou .r moi qui programme en amateur dans un cadre professionel (si ça
existe), j'ai fait avec ce que j'avais ...
Oui, j'ai souvent en cours des gens dans votre situation. Ce n'est pas une
critique. Mais si on vous demande d'écrire un tel logiciel, il serait bon
que l'on vous donne les moyens de le faire avec les bons outils.A ce sujet je cherche un lien ou des explications pour démontrer à mes
employeurs, que le nombre de chiffres après la virgule n'est pas le
nombre de digit significatifs.
Cela a besoin d'être démontré? :-)
http://www.cs.utah.edu/%7Ezachary/isp/applets/FP/FP.html
http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/overview/reals.html
http://www.delorie.com/gnu/docs/glibc/libc_195.html
Google devrait vous aider à trouver d'autres pages similaires.
--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Bonjour,
Sans vouloir trop polémiquer le VB n'est pas aussi bien que Delphi
pour les applications scientifiques.
Si je me trompe pas votre &appli fait des calculs astronomiques (sans
jeu de mot), pour certaine transfo notemment utilisant des angles la
précision (ou le nombre de décimales significatives) est plus
qu'importante et 8 digit après la virgule c'est à peine suffisant dans
bien des cas.
A ce sujet je cherche un lien ou des explications pour démontrer à mes
employeurs, que le nombre de chiffres après la virgule n'est pas le
nombre de digit significatifs.
Christophe
jdd deschamps a écrit :J'ai récupéré une DLL dont j'ai la source. Il y est écrit :
procedure TerreRef(jd:extended;var x0,y0,z0,vx0,vy0,vz0:extended);
stdcall; J'ai mis la DLL dans le répertoire de mon projet, et j'écris en
VB :
Private Declare Sub TerreRef Lib "terredll.dll" _
(ByRef jd as variant, ByVal x0, y0, z0, vx0, vy0, vz0 As Variant)
puis dans le code : Call TerreRef(jd,...)
Cela vous paraît-il correct ?
Le logiciel plante avec arrêt de VB :
AppName: vb5.exe AppVer: 5.0.37.24 ModName: terredll.dll
ModVer: 0.0.0.0 Offset: 0008e73f
Je ne sais pas si c'est la DLL ou ma déclaration qui fait planter.
Bonjour,
Sans vouloir trop polémiquer le VB n'est pas aussi bien que Delphi
pour les applications scientifiques.
Si je me trompe pas votre &appli fait des calculs astronomiques (sans
jeu de mot), pour certaine transfo notemment utilisant des angles la
précision (ou le nombre de décimales significatives) est plus
qu'importante et 8 digit après la virgule c'est à peine suffisant dans
bien des cas.
A ce sujet je cherche un lien ou des explications pour démontrer à mes
employeurs, que le nombre de chiffres après la virgule n'est pas le
nombre de digit significatifs.
Christophe
jdd deschamps a écrit :
J'ai récupéré une DLL dont j'ai la source. Il y est écrit :
procedure TerreRef(jd:extended;var x0,y0,z0,vx0,vy0,vz0:extended);
stdcall; J'ai mis la DLL dans le répertoire de mon projet, et j'écris en
VB :
Private Declare Sub TerreRef Lib "terredll.dll" _
(ByRef jd as variant, ByVal x0, y0, z0, vx0, vy0, vz0 As Variant)
puis dans le code : Call TerreRef(jd,...)
Cela vous paraît-il correct ?
Le logiciel plante avec arrêt de VB :
AppName: vb5.exe AppVer: 5.0.37.24 ModName: terredll.dll
ModVer: 0.0.0.0 Offset: 0008e73f
Je ne sais pas si c'est la DLL ou ma déclaration qui fait planter.
Bonjour,
Sans vouloir trop polémiquer le VB n'est pas aussi bien que Delphi
pour les applications scientifiques.
Si je me trompe pas votre &appli fait des calculs astronomiques (sans
jeu de mot), pour certaine transfo notemment utilisant des angles la
précision (ou le nombre de décimales significatives) est plus
qu'importante et 8 digit après la virgule c'est à peine suffisant dans
bien des cas.
A ce sujet je cherche un lien ou des explications pour démontrer à mes
employeurs, que le nombre de chiffres après la virgule n'est pas le
nombre de digit significatifs.
Christophe
jdd deschamps a écrit :J'ai récupéré une DLL dont j'ai la source. Il y est écrit :
procedure TerreRef(jd:extended;var x0,y0,z0,vx0,vy0,vz0:extended);
stdcall; J'ai mis la DLL dans le répertoire de mon projet, et j'écris en
VB :
Private Declare Sub TerreRef Lib "terredll.dll" _
(ByRef jd as variant, ByVal x0, y0, z0, vx0, vy0, vz0 As Variant)
puis dans le code : Call TerreRef(jd,...)
Cela vous paraît-il correct ?
Le logiciel plante avec arrêt de VB :
AppName: vb5.exe AppVer: 5.0.37.24 ModName: terredll.dll
ModVer: 0.0.0.0 Offset: 0008e73f
Je ne sais pas si c'est la DLL ou ma déclaration qui fait planter.
Sans vouloir être exhaustif sur la question mais plutôt car ma formation de
prof maths et d'enseignant d'informatique il y a plus de 20 ans m'ont amené
à me poser ce genre de question je peux essayer de répondre.
Tous d'abord le nombre de chiffres significatifs dépend de la base dans
laquelle on calcule, en général en base 10. Le plus souvent dans le domaine
scientifique, le dernier chiffre n'est pas significatif, au sens où il ne
correspond pas nécessairement au chiffre de l'écriture du nombre.
Ainsi 2/3 s'écrit 0,66666.... les points de suspension indiquent que le
chiffre 6 est répété à l'infini. Mais dans un calculateur on ne dispose pas
d'un nombre infini de chiffres, donc il faut adopter une méthode d'écriture
(supposons que nous ne disposions que de trois chiffres). Soit on écrit
0,666 avec trois chiffres siginificatifs, c'est à dire que les chiffres
affichés sont bien ceux de l'écriture décimale, soit on écrit 0,667 car ce
nombre est plus proche de 2/3 que le précédent (arrondi à la troisième
décimale), mais alors le 7 n'est pas significatif car il ne figure pas dans
l'écriture de 2/3. Seuls les deux premiers sont significatifs.
En fait une écriture d'un nombre décimal représente en réalité un intervalle
de réels et il n'existe pas d'arithmétqiue ayant les mêmes bonnes propriétés
que l'arithmétique habituelle pour les intervalles. Donc 0,666 dans le
premier cas représente n'importe quel nombre compris entre 0,666 et 0,667
(cette valeur étant exclue)
Pour le deuxième cas 0,666 représentera n'importe quel nombre entre 0,6655
(borne inclue) et 0,6665 (borne exclue).
Pour cette raison les calculatrices modernes utilisent des "chiffres caché",
c'est à dire que le calcul se fait sur (en général) trois chiffres de plus
que ceux qui ont affichés, ce qui permet d'améliorer la précision des
calculs. En effet comme le nombre représente un intervalle, cela signifie
qu'il y a une imprécision sur celui-ci, imprécision qui va s'accroitre au
fur et à mesure des multiplications et divisions successives. En diminuant
l'erreur dans l'écriture, on diminue l'erreur finale.
Ainsi avec notre écriture sur trois chiffres après la virgule, supposons que
l'on ajoute un chiffre caché et que de plus on travaille en arrondi (comme
c'est le cas maintennat sur tous les calculateurs)
1/3 s'écrit 0,333(3) en interne et 0,333 à l'affichage.
Si on multiplie par 3, on obtient avec la méthode précédente (sans chiffre
caché) 0,999, avec la méthode du chiffre caché 0,999(9) en interne et donc
1,000 en affichage.
Pour ce qui concerne les digits, on va supposer qu'il s'agit des bits et
donc d'une écriture en base 2 d'un nombre flottant. Il faut donc connaître
exactement la transformation sur le nombre de bits utilisés permettant
l'écriture (en interne) du nombre considéré, et bien entendu la méthode
inverse. Par exemple
2/3 = 1/2 + 1/8 + 1/32 + 1/128 + ...
On ajoute toutes les puissances négatives et impaires de 2.
Ce qui donnerait (attention ce n'est pas vraiment cela, car il y a aussi la
notion de mantisse et d'exposant ...) 0,10101010...
Sur trois digits réécrits en décimal cela donne 0,101 soit 0,625, on voit
que l'on est un peu loin de 0,667.
J'espère avoir pu éclairer certains aspects de l'écriture des nombres en
informatique, vaste et délicat sujet.
Je termine par une annecdocte : il y plusieurs années, en utilisant une
calculatrice programmable et le calcul d'une série de nombre dont la valeur
s'approchait de plus en plus de PI, j'avais montré aux élèves que PI=0 car
au bout d'un certain temps c'est cette dernière valeur qui revenait
constamment. C'était un problème d'arrondi qui faisait qu'une valeur
positive mais trop petite pour se coder dans la machine prenait la valeur 0.
"Patrick Philippot" a écrit dans le
message de news:christophe-pasde<> @wanadoo.fr>" < wrote:Oui quand on a la chance de connaitre plusieurs langages,
Pou .r moi qui programme en amateur dans un cadre professionel (si ça
existe), j'ai fait avec ce que j'avais ...
Oui, j'ai souvent en cours des gens dans votre situation. Ce n'est pas une
critique. Mais si on vous demande d'écrire un tel logiciel, il serait bon
que l'on vous donne les moyens de le faire avec les bons outils.A ce sujet je cherche un lien ou des explications pour démontrer à mes
employeurs, que le nombre de chiffres après la virgule n'est pas le
nombre de digit significatifs.
Cela a besoin d'être démontré? :-)
http://www.cs.utah.edu/%7Ezachary/isp/applets/FP/FP.html
http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/overview/reals.html
http://www.delorie.com/gnu/docs/glibc/libc_195.html
Google devrait vous aider à trouver d'autres pages similaires.
--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Sans vouloir être exhaustif sur la question mais plutôt car ma formation de
prof maths et d'enseignant d'informatique il y a plus de 20 ans m'ont amené
à me poser ce genre de question je peux essayer de répondre.
Tous d'abord le nombre de chiffres significatifs dépend de la base dans
laquelle on calcule, en général en base 10. Le plus souvent dans le domaine
scientifique, le dernier chiffre n'est pas significatif, au sens où il ne
correspond pas nécessairement au chiffre de l'écriture du nombre.
Ainsi 2/3 s'écrit 0,66666.... les points de suspension indiquent que le
chiffre 6 est répété à l'infini. Mais dans un calculateur on ne dispose pas
d'un nombre infini de chiffres, donc il faut adopter une méthode d'écriture
(supposons que nous ne disposions que de trois chiffres). Soit on écrit
0,666 avec trois chiffres siginificatifs, c'est à dire que les chiffres
affichés sont bien ceux de l'écriture décimale, soit on écrit 0,667 car ce
nombre est plus proche de 2/3 que le précédent (arrondi à la troisième
décimale), mais alors le 7 n'est pas significatif car il ne figure pas dans
l'écriture de 2/3. Seuls les deux premiers sont significatifs.
En fait une écriture d'un nombre décimal représente en réalité un intervalle
de réels et il n'existe pas d'arithmétqiue ayant les mêmes bonnes propriétés
que l'arithmétique habituelle pour les intervalles. Donc 0,666 dans le
premier cas représente n'importe quel nombre compris entre 0,666 et 0,667
(cette valeur étant exclue)
Pour le deuxième cas 0,666 représentera n'importe quel nombre entre 0,6655
(borne inclue) et 0,6665 (borne exclue).
Pour cette raison les calculatrices modernes utilisent des "chiffres caché",
c'est à dire que le calcul se fait sur (en général) trois chiffres de plus
que ceux qui ont affichés, ce qui permet d'améliorer la précision des
calculs. En effet comme le nombre représente un intervalle, cela signifie
qu'il y a une imprécision sur celui-ci, imprécision qui va s'accroitre au
fur et à mesure des multiplications et divisions successives. En diminuant
l'erreur dans l'écriture, on diminue l'erreur finale.
Ainsi avec notre écriture sur trois chiffres après la virgule, supposons que
l'on ajoute un chiffre caché et que de plus on travaille en arrondi (comme
c'est le cas maintennat sur tous les calculateurs)
1/3 s'écrit 0,333(3) en interne et 0,333 à l'affichage.
Si on multiplie par 3, on obtient avec la méthode précédente (sans chiffre
caché) 0,999, avec la méthode du chiffre caché 0,999(9) en interne et donc
1,000 en affichage.
Pour ce qui concerne les digits, on va supposer qu'il s'agit des bits et
donc d'une écriture en base 2 d'un nombre flottant. Il faut donc connaître
exactement la transformation sur le nombre de bits utilisés permettant
l'écriture (en interne) du nombre considéré, et bien entendu la méthode
inverse. Par exemple
2/3 = 1/2 + 1/8 + 1/32 + 1/128 + ...
On ajoute toutes les puissances négatives et impaires de 2.
Ce qui donnerait (attention ce n'est pas vraiment cela, car il y a aussi la
notion de mantisse et d'exposant ...) 0,10101010...
Sur trois digits réécrits en décimal cela donne 0,101 soit 0,625, on voit
que l'on est un peu loin de 0,667.
J'espère avoir pu éclairer certains aspects de l'écriture des nombres en
informatique, vaste et délicat sujet.
Je termine par une annecdocte : il y plusieurs années, en utilisant une
calculatrice programmable et le calcul d'une série de nombre dont la valeur
s'approchait de plus en plus de PI, j'avais montré aux élèves que PI=0 car
au bout d'un certain temps c'est cette dernière valeur qui revenait
constamment. C'était un problème d'arrondi qui faisait qu'une valeur
positive mais trop petite pour se coder dans la machine prenait la valeur 0.
"Patrick Philippot" <patrick.philippot@mainsoft.xx.fr> a écrit dans le
message de news: uEB9rVJzEHA.748@TK2MSFTNGP14.phx.gbl...
christophe-pasde<> @wanadoo.fr>" < wrote:
Oui quand on a la chance de connaitre plusieurs langages,
Pou .r moi qui programme en amateur dans un cadre professionel (si ça
existe), j'ai fait avec ce que j'avais ...
Oui, j'ai souvent en cours des gens dans votre situation. Ce n'est pas une
critique. Mais si on vous demande d'écrire un tel logiciel, il serait bon
que l'on vous donne les moyens de le faire avec les bons outils.
A ce sujet je cherche un lien ou des explications pour démontrer à mes
employeurs, que le nombre de chiffres après la virgule n'est pas le
nombre de digit significatifs.
Cela a besoin d'être démontré? :-)
http://www.cs.utah.edu/%7Ezachary/isp/applets/FP/FP.html
http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/overview/reals.html
http://www.delorie.com/gnu/docs/glibc/libc_195.html
Google devrait vous aider à trouver d'autres pages similaires.
--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Sans vouloir être exhaustif sur la question mais plutôt car ma formation de
prof maths et d'enseignant d'informatique il y a plus de 20 ans m'ont amené
à me poser ce genre de question je peux essayer de répondre.
Tous d'abord le nombre de chiffres significatifs dépend de la base dans
laquelle on calcule, en général en base 10. Le plus souvent dans le domaine
scientifique, le dernier chiffre n'est pas significatif, au sens où il ne
correspond pas nécessairement au chiffre de l'écriture du nombre.
Ainsi 2/3 s'écrit 0,66666.... les points de suspension indiquent que le
chiffre 6 est répété à l'infini. Mais dans un calculateur on ne dispose pas
d'un nombre infini de chiffres, donc il faut adopter une méthode d'écriture
(supposons que nous ne disposions que de trois chiffres). Soit on écrit
0,666 avec trois chiffres siginificatifs, c'est à dire que les chiffres
affichés sont bien ceux de l'écriture décimale, soit on écrit 0,667 car ce
nombre est plus proche de 2/3 que le précédent (arrondi à la troisième
décimale), mais alors le 7 n'est pas significatif car il ne figure pas dans
l'écriture de 2/3. Seuls les deux premiers sont significatifs.
En fait une écriture d'un nombre décimal représente en réalité un intervalle
de réels et il n'existe pas d'arithmétqiue ayant les mêmes bonnes propriétés
que l'arithmétique habituelle pour les intervalles. Donc 0,666 dans le
premier cas représente n'importe quel nombre compris entre 0,666 et 0,667
(cette valeur étant exclue)
Pour le deuxième cas 0,666 représentera n'importe quel nombre entre 0,6655
(borne inclue) et 0,6665 (borne exclue).
Pour cette raison les calculatrices modernes utilisent des "chiffres caché",
c'est à dire que le calcul se fait sur (en général) trois chiffres de plus
que ceux qui ont affichés, ce qui permet d'améliorer la précision des
calculs. En effet comme le nombre représente un intervalle, cela signifie
qu'il y a une imprécision sur celui-ci, imprécision qui va s'accroitre au
fur et à mesure des multiplications et divisions successives. En diminuant
l'erreur dans l'écriture, on diminue l'erreur finale.
Ainsi avec notre écriture sur trois chiffres après la virgule, supposons que
l'on ajoute un chiffre caché et que de plus on travaille en arrondi (comme
c'est le cas maintennat sur tous les calculateurs)
1/3 s'écrit 0,333(3) en interne et 0,333 à l'affichage.
Si on multiplie par 3, on obtient avec la méthode précédente (sans chiffre
caché) 0,999, avec la méthode du chiffre caché 0,999(9) en interne et donc
1,000 en affichage.
Pour ce qui concerne les digits, on va supposer qu'il s'agit des bits et
donc d'une écriture en base 2 d'un nombre flottant. Il faut donc connaître
exactement la transformation sur le nombre de bits utilisés permettant
l'écriture (en interne) du nombre considéré, et bien entendu la méthode
inverse. Par exemple
2/3 = 1/2 + 1/8 + 1/32 + 1/128 + ...
On ajoute toutes les puissances négatives et impaires de 2.
Ce qui donnerait (attention ce n'est pas vraiment cela, car il y a aussi la
notion de mantisse et d'exposant ...) 0,10101010...
Sur trois digits réécrits en décimal cela donne 0,101 soit 0,625, on voit
que l'on est un peu loin de 0,667.
J'espère avoir pu éclairer certains aspects de l'écriture des nombres en
informatique, vaste et délicat sujet.
Je termine par une annecdocte : il y plusieurs années, en utilisant une
calculatrice programmable et le calcul d'une série de nombre dont la valeur
s'approchait de plus en plus de PI, j'avais montré aux élèves que PI=0 car
au bout d'un certain temps c'est cette dernière valeur qui revenait
constamment. C'était un problème d'arrondi qui faisait qu'une valeur
positive mais trop petite pour se coder dans la machine prenait la valeur 0.
"Patrick Philippot" a écrit dans le
message de news:christophe-pasde<> @wanadoo.fr>" < wrote:Oui quand on a la chance de connaitre plusieurs langages,
Pou .r moi qui programme en amateur dans un cadre professionel (si ça
existe), j'ai fait avec ce que j'avais ...
Oui, j'ai souvent en cours des gens dans votre situation. Ce n'est pas une
critique. Mais si on vous demande d'écrire un tel logiciel, il serait bon
que l'on vous donne les moyens de le faire avec les bons outils.A ce sujet je cherche un lien ou des explications pour démontrer à mes
employeurs, que le nombre de chiffres après la virgule n'est pas le
nombre de digit significatifs.
Cela a besoin d'être démontré? :-)
http://www.cs.utah.edu/%7Ezachary/isp/applets/FP/FP.html
http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/overview/reals.html
http://www.delorie.com/gnu/docs/glibc/libc_195.html
Google devrait vous aider à trouver d'autres pages similaires.
--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Que faites vous du pseudo-type Decimal de VB ?
Que faites vous du pseudo-type Decimal de VB ?
Que faites vous du pseudo-type Decimal de VB ?
J'ai récupéré une DLL dont j'ai la source. Il y est écrit :
procedure TerreRef(jd:extended;var x0,y0,z0,vx0,vy0,vz0:extended); stdcall;
J'ai mis la DLL dans le répertoire de mon projet, et j'écris en VB :
Private Declare Sub TerreRef Lib "terredll.dll" _
(ByRef jd as variant, ByVal x0, y0, z0, vx0, vy0, vz0 As Variant)
puis dans le code : Call TerreRef(jd,...)
Cela vous paraît-il correct ?
Le logiciel plante avec arrêt de VB :
AppName: vb5.exe AppVer: 5.0.37.24 ModName: terredll.dll
ModVer: 0.0.0.0 Offset: 0008e73f
Je ne sais pas si c'est la DLL ou ma déclaration qui fait planter.
J'ai récupéré une DLL dont j'ai la source. Il y est écrit :
procedure TerreRef(jd:extended;var x0,y0,z0,vx0,vy0,vz0:extended); stdcall;
J'ai mis la DLL dans le répertoire de mon projet, et j'écris en VB :
Private Declare Sub TerreRef Lib "terredll.dll" _
(ByRef jd as variant, ByVal x0, y0, z0, vx0, vy0, vz0 As Variant)
puis dans le code : Call TerreRef(jd,...)
Cela vous paraît-il correct ?
Le logiciel plante avec arrêt de VB :
AppName: vb5.exe AppVer: 5.0.37.24 ModName: terredll.dll
ModVer: 0.0.0.0 Offset: 0008e73f
Je ne sais pas si c'est la DLL ou ma déclaration qui fait planter.
J'ai récupéré une DLL dont j'ai la source. Il y est écrit :
procedure TerreRef(jd:extended;var x0,y0,z0,vx0,vy0,vz0:extended); stdcall;
J'ai mis la DLL dans le répertoire de mon projet, et j'écris en VB :
Private Declare Sub TerreRef Lib "terredll.dll" _
(ByRef jd as variant, ByVal x0, y0, z0, vx0, vy0, vz0 As Variant)
puis dans le code : Call TerreRef(jd,...)
Cela vous paraît-il correct ?
Le logiciel plante avec arrêt de VB :
AppName: vb5.exe AppVer: 5.0.37.24 ModName: terredll.dll
ModVer: 0.0.0.0 Offset: 0008e73f
Je ne sais pas si c'est la DLL ou ma déclaration qui fait planter.