apparement ma reponse est dans la nature quelque part.
Donc je recommence: Pour la mise au point du calcul, j'imagine pas à l'utilisation ? Sinon, je ne vois pas l'interet de faire 2x ce calcul.
Je parlais bien de l'implementation. et je n'ai pas dit "refaire" le calcul mais "affiner".
Pour illustration, prenons un exemple concret: l'implementation de la fonction inverse en double precision sur une machine n'implementant pas la division directement. Pour info le calcul de a/b se fait en calculant 1/b puis en effectuant la multiplication avec a. Donc 1/b n'est pas la simple division de 1 par b.
Imaginons que tu saches calculer 1/b avec une faible precision. On dira que c'est y.
On note que la fonction f(x)=1/x - b a une racine pour x=1/b
En utilisant Newton-Ramson pour trouver la racine de f, on obtient la serie:
x_{n+1} = x_n(2-b*x_n)
Cette serie converge vers 1/b, ce que l'on cherche.
La convergence dans notre cas est quadratic, et le nombre d'etapes necessaire pour obtenir un resultat avec une prevision inferieure a une erreur donnee depend de la difference entre x_0 et 1/b.
A noter que cette serie n'utilise que des multiplications et des additions/soustractions.
Plus x_0 est proche de 1/b, moins d'etapes sont necessaires pour obtenir 1/b avec une precision voulue.
Dans beaucoup de CPU, la fonction inverse est implementee de cette facon, le CPU ne fournissant qu'une valeur approchee de la division...
Idem pour la racine carree.
C'est la meme methodologie utilisee pour la methode hybride simple et double precision:
- La serie est etablie sur papier et l'etude de la convergence de l'erreur etablit le nombre maximal d'iteration a effectuer pour obtenir un resultat correct en double precision pour un x_0 initial avec une precision inferieure ou egale a ce que l'on aurait au pire avec une implementation en simple precision. Evidement, on tient compte du fait que la multiplication et addition sont arrondies.
- Le calcul en precision simple etabli x_0 afin d'avoir une valeur approchee dont on majore l'erreur.
- On applique les n iterations necessaire
C'est effectivement plus complexe a etablir que de tout faire en double, mais ca peut avoir un gain enorme dans certains cas.
C'est encore la supériorité de la fpu x87 par rapport à SSE.
Tout depend de la methode d'evaluation de ce qui est meilleur a un autre. Cependant:
- En terme de transistor, n'implementer que des multiplications et addition, c'est moins couteux.
- De meme, si tu as besoin d'une precision plus fine que simple mais pas autant que double, tu y gagnes.
- Si quelqu'un trouves une meilleur implementation, ben c'est logiciel. Idem pour les bugs (le bug du Pentium sur la FP etant une mauvaise implementation de la fonction "approchee" de 1/x).
- Si pour un calcul unique c'est pas superieur a une fonction hardware, le fait que la multiplication et l'addition peut etre implemente dans un micropipeline, appliquer la meme fonction sur plusieures valeurs peut etre plus rapide que l'application sequentielle de cette operation sur chacune des valeures.
Cela revient à une étude d'interval, non ?
Oui mais on verifie deja dans les cas dont on sait que les sous operations de la fonction ont des discontinuites avant de se prendre la tete a verifier quelque chose dont on est pas sur que ce soit verifiable.
J'ai bon ?
Oui, mais je rajouterais les etapes initiales:
- Je definis quels sont mes besoins en terme de precision.
- Je verifie que quelqu'un l'a pas deja fait, parce que une prise de tete enorme s'annonce
A la fin:
- Je cree une doc avec mes formules mathematiques comme ca cela servira a quelqu'un d'autre. Les capacites de formatage etant limite dans un code source pour prouver mon erreur, faire ca dans un fichier a part. Genre avec LaTeX.
[^] # Re: plop again
Posté par mdlh . En réponse au journal Comment les programmeurs écrivent du code flottant ?. Évalué à 4.
Donc je recommence:
Pour la mise au point du calcul, j'imagine pas à l'utilisation ? Sinon, je ne vois pas l'interet de faire 2x ce calcul.
Je parlais bien de l'implementation. et je n'ai pas dit "refaire" le calcul mais "affiner".
Pour illustration, prenons un exemple concret: l'implementation de la fonction inverse en double precision sur une machine n'implementant pas la division directement. Pour info le calcul de a/b se fait en calculant 1/b puis en effectuant la multiplication avec a. Donc 1/b n'est pas la simple division de 1 par b.
Imaginons que tu saches calculer 1/b avec une faible precision. On dira que c'est y.
On note que la fonction f(x)=1/x - b a une racine pour x=1/b
En utilisant Newton-Ramson pour trouver la racine de f, on obtient la serie:
x_{n+1} = x_n(2-b*x_n)
Cette serie converge vers 1/b, ce que l'on cherche.
La convergence dans notre cas est quadratic, et le nombre d'etapes necessaire pour obtenir un resultat avec une prevision inferieure a une erreur donnee depend de la difference entre x_0 et 1/b.
A noter que cette serie n'utilise que des multiplications et des additions/soustractions.
Plus x_0 est proche de 1/b, moins d'etapes sont necessaires pour obtenir 1/b avec une precision voulue.
Dans beaucoup de CPU, la fonction inverse est implementee de cette facon, le CPU ne fournissant qu'une valeur approchee de la division...
Idem pour la racine carree.
C'est la meme methodologie utilisee pour la methode hybride simple et double precision:
- La serie est etablie sur papier et l'etude de la convergence de l'erreur etablit le nombre maximal d'iteration a effectuer pour obtenir un resultat correct en double precision pour un x_0 initial avec une precision inferieure ou egale a ce que l'on aurait au pire avec une implementation en simple precision. Evidement, on tient compte du fait que la multiplication et addition sont arrondies.
- Le calcul en precision simple etabli x_0 afin d'avoir une valeur approchee dont on majore l'erreur.
- On applique les n iterations necessaire
C'est effectivement plus complexe a etablir que de tout faire en double, mais ca peut avoir un gain enorme dans certains cas.
C'est encore la supériorité de la fpu x87 par rapport à SSE.
Tout depend de la methode d'evaluation de ce qui est meilleur a un autre. Cependant:
- En terme de transistor, n'implementer que des multiplications et addition, c'est moins couteux.
- De meme, si tu as besoin d'une precision plus fine que simple mais pas autant que double, tu y gagnes.
- Si quelqu'un trouves une meilleur implementation, ben c'est logiciel. Idem pour les bugs (le bug du Pentium sur la FP etant une mauvaise implementation de la fonction "approchee" de 1/x).
- Si pour un calcul unique c'est pas superieur a une fonction hardware, le fait que la multiplication et l'addition peut etre implemente dans un micropipeline, appliquer la meme fonction sur plusieures valeurs peut etre plus rapide que l'application sequentielle de cette operation sur chacune des valeures.
Cela revient à une étude d'interval, non ?
Oui mais on verifie deja dans les cas dont on sait que les sous operations de la fonction ont des discontinuites avant de se prendre la tete a verifier quelque chose dont on est pas sur que ce soit verifiable.
J'ai bon ?
Oui, mais je rajouterais les etapes initiales:
- Je definis quels sont mes besoins en terme de precision.
- Je verifie que quelqu'un l'a pas deja fait, parce que une prise de tete enorme s'annonce
A la fin:
- Je cree une doc avec mes formules mathematiques comme ca cela servira a quelqu'un d'autre. Les capacites de formatage etant limite dans un code source pour prouver mon erreur, faire ca dans un fichier a part. Genre avec LaTeX.