Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Float vs Double

20 réponses
Avatar
korchkidu
Bonjour,

je cherche a savoir s'il est reellement plus rapide d'utiliser des
floats que des doubles et pourquoi?
Et en ce qui concerne la taille memoire?
Rem: je parle pour le cas d'un PC normal hein...

Merci,
K.
PS: ces questions peuvent paraitre idiotes mais on a souvent des
surprises en fait...

10 réponses

1 2
Avatar
Antoine Leca
En news:43e89dca$, korchkidu va escriure:
Rem: je parle pour le cas d'un PC normal hein...


<PÉDANT>
Lequel ?

Parce qu'il y a une différence à ce niveau entre les PC en mode 16/32 bits
(utilisation du NPX), et les modes 64 bits (utilisation du SSE/SSE2)
</PÉDANT>


Antoine

Avatar
Laurent Deniau
Vincent Lefevre wrote:
Dans l'article <dsa7g1$t0c$,
Laurent Deniau écrit:


Pour eviter les surprises, utilise des doubles partout et des long
double dans les calculs intermediaires.



Tout dépend du processeur et de l'OS. Il faut savoir qu'avec le FPU
traditionnel du x86, les calculs se feront soit en double précision
IEEE 754, soit en double étendu, quel que soit le type utilisé.
Plus les bugs du compilateur... Avec d'autres processeurs,
long double = double.


Ma proposition visait a donner une solution simple, portable et purement
C qui minimisait les degats. Elle n'avait pas la pretention d'etre
l'unique bonne solution. Notament parce que meme en mode etendu (80 bits
sur x86), le resultat peut-etre incorrect. En fait le passage par SSE
est obligatoire puisque pour etre conforme a IEEE754, il est prouve
qu'il faut faire les calculs sur 128bits (119bits pour exp si mes
souvenirs sont bons) pour etre conforme sur 64bits apres arondi.

Le nec plus ultra etant d'utiliser la bibliotheque MPFR
(http://www.mpfr.org/) si possible.



Oui. :)


Et c'est ce qu'ils font (utiliser SSE).

a+, ld.


Avatar
Vincent Lefevre
Dans l'article <dscqpp$lc8$,
Laurent Deniau écrit:

Ma proposition visait a donner une solution simple, portable et
purement C qui minimisait les degats.


Si on inclut le x86 traditionnel, l'arithmétique flottante n'est pas
complètement portable dans le sens où on peut obtenir des résultats
différents sur différentes machines, notamment s'il y a des tests
d'égalité ou si on utilise des algo style (Fast)2Sum / expansions
(qui deviennent faux en cas d'arrondi non suffisamment contrôlé).

Elle n'avait pas la pretention d'etre l'unique bonne solution.
Notament parce que meme en mode etendu (80 bits sur x86), le
resultat peut-etre incorrect. En fait le passage par SSE est
obligatoire puisque pour etre conforme a IEEE754, il est prouve
qu'il faut faire les calculs sur 128bits (119bits pour exp si mes
souvenirs sont bons) pour etre conforme sur 64bits apres arondi.


Tu as l'air de confondre... Les fonctions élémentaires, comme exp,
ne sont pas considérées dans la norme IEEE 754 (elles devraient
l'être dans la révision en cours).

Concernant le 119 bits, si tu fais référence à

http://anp.lip6.fr/~pyr/Arinews/Arinews-printemps2004-F_de_Dinechin.pdf

c'est juste un corollaire des résultats de mes tests exhaustifs de
exp/log en double précision. Ensuite, les pires cas, on peut les
tabuler si besoin est (il y a un exemple dans ma thèse, concernant
le calcul de 2^x). Et il s'agit de l'arrondi en double précision
(53 bits, pas 64 bits).

Crlibm ne se base pas sur SSE, mais change le mot de contrôle du FPU
traditionnel.

Le nec plus ultra etant d'utiliser la bibliotheque MPFR
(http://www.mpfr.org/) si possible.


Oui. :)


Et c'est ce qu'ils font (utiliser SSE).


Pour MPFR, on se base presque entièrement sur GMP (plus précisément
les couches mpn et mpz). Il reste peut-être quelques calculs flottants
pour le calcul des termes d'erreur ou des choses de ce genre, ce qui
donne parfois des bugs (on corrige au fur et à mesure...). Il y en a
aussi pour les conversions avec les double et long double, évidemment;
mais on ne force pas SSE (l'utilisateur peut le faire via le CFLAGS,
et d'ailleurs, je crois que nous n'avons jamais testé...).

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / SPACES project at LORIA



Avatar
Laurent Deniau
Vincent Lefevre wrote:
Dans l'article <dscqpp$lc8$,
Laurent Deniau écrit:


Ma proposition visait a donner une solution simple, portable et
purement C qui minimisait les degats.



Si on inclut le x86 traditionnel, l'arithmétique flottante n'est pas
complètement portable dans le sens où on peut obtenir des résultats
différents sur différentes machines, notamment s'il y a des tests
d'égalité ou si on utilise des algo style (Fast)2Sum / expansions
(qui deviennent faux en cas d'arrondi non suffisamment contrôlé).


Je parlais de portablilite au sens du C, pas de la stabilite des resultats.

Elle n'avait pas la pretention d'etre l'unique bonne solution.
Notament parce que meme en mode etendu (80 bits sur x86), le
resultat peut-etre incorrect. En fait le passage par SSE est
obligatoire puisque pour etre conforme a IEEE754, il est prouve
qu'il faut faire les calculs sur 128bits (119bits pour exp si mes
souvenirs sont bons) pour etre conforme sur 64bits apres arondi.



Tu as l'air de confondre... Les fonctions élémentaires, comme exp,
ne sont pas considérées dans la norme IEEE 754 (elles devraient
l'être dans la révision en cours).


Non, je ne confonds pas. Je parle des intervalles representable par
IEEE754 comme domaine des fonctions elementaires. Ce que je voulais dire
c'est que pour que les fonctions elementaires soient correctes sur du
IEEE754 64bits (et donc 53bits de mantisse), il faut une ALU de 128 bits
en interne. Florent disait utiliser l'Itanium pour ecrire les premieres
versions de cr-libm, ce qui a d'ailleurs interesse Intel.

Concernant le 119 bits, si tu fais référence à

http://anp.lip6.fr/~pyr/Arinews/Arinews-printemps2004-F_de_Dinechin.pdf


voui et aussi

http://lipforge.ens-lyon.fr/www/crlibm/documents/cern.pdf

C'est la que j'ai eu l'occasion de discuter avec lui.

c'est juste un corollaire des résultats de mes tests exhaustifs de
exp/log en double précision. Ensuite, les pires cas, on peut les
tabuler si besoin est (il y a un exemple dans ma thèse, concernant
le calcul de 2^x). Et il s'agit de l'arrondi en double précision
(53 bits, pas 64 bits).


voui, j'avais pris un raccourci en parlant du format 64bits de IEEE754
par opposition au format 32bits et etendu.

Crlibm ne se base pas sur SSE, mais change le mot de contrôle du FPU
traditionnel.


Et que deviennent les FMA que l'on trouve dans tous leurs algos sans SSE?

Le nec plus ultra etant d'utiliser la bibliotheque MPFR
(http://www.mpfr.org/) si possible.


Oui. :)




Et c'est ce qu'ils font (utiliser SSE).



Pour MPFR, on se base presque entièrement sur GMP (plus précisément
les couches mpn et mpz). Il reste peut-être quelques calculs flottants
pour le calcul des termes d'erreur ou des choses de ce genre, ce qui
donne parfois des bugs (on corrige au fur et à mesure...). Il y en a
aussi pour les conversions avec les double et long double, évidemment;
mais on ne force pas SSE (l'utilisateur peut le faire via le CFLAGS,
et d'ailleurs, je crois que nous n'avons jamais testé...).


Ok. Ceci dit, cr-libm semble etre plus rapide que MPFR.

a+, ld.




Avatar
Vincent Lefevre
Dans l'article <dsf33f$ioj$,
Laurent Deniau écrit:

Elle n'avait pas la pretention d'etre l'unique bonne solution.
Notament parce que meme en mode etendu (80 bits sur x86), le
resultat peut-etre incorrect. En fait le passage par SSE est
obligatoire puisque pour etre conforme a IEEE754, il est prouve
qu'il faut faire les calculs sur 128bits (119bits pour exp si mes
souvenirs sont bons) pour etre conforme sur 64bits apres arondi.


Tu as l'air de confondre... Les fonctions élémentaires, comme exp,
ne sont pas considérées dans la norme IEEE 754 (elles devraient
l'être dans la révision en cours).


Non, je ne confonds pas. Je parle des intervalles representable par
IEEE754 comme domaine des fonctions elementaires.


Ce n'est donc pas de "conformité" dont tu veux parler.

Ce que je voulais dire c'est que pour que les fonctions elementaires
soient correctes sur du IEEE754 64bits (et donc 53bits de mantisse),
il faut une ALU de 128 bits en interne.


Non, et de toute façon, y a-t-il des processeurs qui ont une ALU
de 128 bits? Que ce soit en entier ou en flottant, tu peux émuler
de la précision supérieure avec une précision réduite. C'est ce
que les algo font en pratique.

D'ailleurs, SCSLib, sur laquelle est basée CrLibm, semble utiliser
des entiers 32 bits:

struct scs {
/** the digits, as 32 bits words */
uint32_t h_word[SCS_NB_WORDS];
/** Used to store Nan,+/-0, Inf, etc and then let the hardware handle them */
db_number exception;
/** This corresponds to the exponent in an FP format, but here we are
in base 2^32 */
int index;
/** The sign equals 1 or -1*/
int sign;
};

Crlibm ne se base pas sur SSE, mais change le mot de contrôle du FPU
traditionnel.


Et que deviennent les FMA que l'on trouve dans tous leurs algos sans SSE?


Le code a:

#if defined(PROCESSOR_HAS_FMA)

Mais l'arrondi exact fourni par le FMA n'est apparemment pas utilisé.

Ok. Ceci dit, cr-libm semble etre plus rapide que MPFR.


Évidemment, car MPFR est à précision arbitraire et n'est pas optimisée
pour une précision donnée.

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / SPACES project at LORIA



Avatar
Laurent Deniau
Vincent Lefevre wrote:
Dans l'article <dsf33f$ioj$, Laurent Deniau
écrit:


Elle n'avait pas la pretention d'etre l'unique bonne solution.
Notament parce que meme en mode etendu (80 bits sur x86), le
resultat peut-etre incorrect. En fait le passage par SSE est
obligatoire puisque pour etre conforme a IEEE754, il est prouve
qu'il faut faire les calculs sur 128bits (119bits pour exp si
mes souvenirs sont bons) pour etre conforme sur 64bits apres
arondi.


Tu as l'air de confondre... Les fonctions élémentaires, comme
exp, ne sont pas considérées dans la norme IEEE 754 (elles
devraient l'être dans la révision en cours).




Non, je ne confonds pas. Je parle des intervalles representable par
IEEE754 comme domaine des fonctions elementaires.



Ce n'est donc pas de "conformité" dont tu veux parler.


Non, de stabilite (cette fois ;-) ) des fonctions elementaires sur leur
domaine.

Ce que je voulais dire c'est que pour que les fonctions
elementaires soient correctes sur du IEEE754 64bits (et donc 53bits
de mantisse), il faut une ALU de 128 bits en interne.



Non, et de toute façon, y a-t-il des processeurs qui ont une ALU de
128 bits?


Meaculpa, je voulais dire une FPU de 128bits (decidement ce matin j'ai
du brouillard dans la tete).

Que ce soit en entier ou en flottant, tu peux émuler de la
précision supérieure avec une précision réduite. C'est ce que les
algo font en pratique.


Je parle de support natif par le processeur. Biensur que l'emulation est
possible et existe depuis des lustres. Mais je suppose que tu as eu
cette reponse en raison de mon erreur ALU vs FPU.

D'ailleurs, SCSLib, sur laquelle est basée CrLibm, semble utiliser
des entiers 32 bits:

struct scs { /** the digits, as 32 bits words */ uint32_t
h_word[SCS_NB_WORDS]; /** Used to store Nan,+/-0, Inf, etc and then
let the hardware handle them */ db_number exception; /** This
corresponds to the exponent in an FP format, but here we are in base
2^32 */ int index; /** The sign equals 1 or -1*/ int sign;
};

Crlibm ne se base pas sur SSE, mais change le mot de contrôle du
FPU traditionnel.


Et que deviennent les FMA que l'on trouve dans tous leurs algos
sans SSE?


Le code a:

#if defined(PROCESSOR_HAS_FMA)

Mais l'arrondi exact fourni par le FMA n'est apparemment pas utilisé.


Ce que j'avais vu etait du code C (code que Florent avait sur son
portable) contenant des parties assembleurs utilisant du SSE ainsi que
du C99 comme les constantes flottantes hexadecimales pour remplir les
tables avec une meilleure precision (evite les arrondis du compilateur
lui-meme lors du changement de base). Mais c'etait probablement une
version dediee x86+SSE+C99. Je crois que cr-libm a une multitudes de
variantes non-officielles et que celle dont tu parles est la version
"portable" environ 2-3 fois plus lente que celle que j'ai vu.

Ok. Ceci dit, cr-libm semble etre plus rapide que MPFR.



Évidemment, car MPFR est à précision arbitraire et n'est pas
optimisée pour une précision donnée.


Rien n'empeche de faire des specialisations conditionnelles a-la-FFTW,
mais je crois que ce n'est pas le but de la bib ;-)

a+, ld.




Avatar
Vincent Lefevre
Dans l'article <dsfaai$5ia$,
Laurent Deniau écrit:

Vincent Lefevre wrote:
Dans l'article <dsf33f$ioj$, Laurent Deniau
écrit:
Ce que je voulais dire c'est que pour que les fonctions
elementaires soient correctes sur du IEEE754 64bits (et donc 53bits
de mantisse), il faut une ALU de 128 bits en interne.


Non, et de toute façon, y a-t-il des processeurs qui ont une ALU de
128 bits?


Meaculpa, je voulais dire une FPU de 128bits (decidement ce matin j'ai
du brouillard dans la tete).


Les FPU n'ont de toute façon pas 128 bits. Pour x86: 64 bits de
mantisse, 1 bit de signe et 15 bits d'exposant, ça fait 80 bits
en tout.

Que ce soit en entier ou en flottant, tu peux émuler de la
précision supérieure avec une précision réduite. C'est ce que les
algo font en pratique.


Je parle de support natif par le processeur. Biensur que l'emulation est
possible et existe depuis des lustres. Mais je suppose que tu as eu
cette reponse en raison de mon erreur ALU vs FPU.


64 bits de mantisse, ça permet d'avoir une implémentation de
certaines fonctions élémentaires en double précision (53 bits
de mantisse) dans un domaine raisonnable et avec une précision
finale pas trop mauvaise. Maintenant, dans la pratique, c'est
insuffisant, et les bibliothèques existantes font mieux.

Ce que j'avais vu etait du code C (code que Florent avait sur son
portable) contenant des parties assembleurs utilisant du SSE ainsi que
du C99 comme les constantes flottantes hexadecimales pour remplir les
tables avec une meilleure precision (evite les arrondis du compilateur
lui-meme lors du changement de base). Mais c'etait probablement une
version dediee x86+SSE+C99. Je crois que cr-libm a une multitudes de
variantes non-officielles et que celle dont tu parles est la version
"portable" environ 2-3 fois plus lente que celle que j'ai vu.


Ça dépend peut-être de la fonction. Dans le code que j'ai sous les
yeux, pour la fonction atan, il y a:

atan-itanium.c
atan-pentium.c
atan_accurate.c
atan_fast.c

Évidemment, car MPFR est à précision arbitraire et n'est pas
optimisée pour une précision donnée.


Rien n'empeche de faire des specialisations conditionnelles a-la-FFTW,
mais je crois que ce n'est pas le but de la bib ;-)


Oui, ça serait trop lourd. C'est déjà assez compliqué comme ça...
Enfin, il y a maintenant des fonctions (internes) comme mpfr_add1sp
qui fait une addition sous la condition que les 3 objets ont la
même précision (ce qui est souvent le cas dans la pratique).

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / SPACES project at LORIA



Avatar
Laurent Deniau
Vincent Lefevre wrote:
Les FPU n'ont de toute façon pas 128 bits. Pour x86: 64 bits de
mantisse, 1 bit de signe et 15 bits d'exposant, ça fait 80 bits
en tout.


On tourne en rond...

Ce que j'avais vu etait du code C (code que Florent avait sur son
portable) contenant des parties assembleurs utilisant du SSE ainsi que
du C99 comme les constantes flottantes hexadecimales pour remplir les
tables avec une meilleure precision (evite les arrondis du compilateur
lui-meme lors du changement de base). Mais c'etait probablement une
version dediee x86+SSE+C99. Je crois que cr-libm a une multitudes de
variantes non-officielles et que celle dont tu parles est la version
"portable" environ 2-3 fois plus lente que celle que j'ai vu.



Ça dépend peut-être de la fonction. Dans le code que j'ai sous les
yeux, pour la fonction atan, il y a:

atan-itanium.c
atan-pentium.c
atan_accurate.c
atan_fast.c


Est-ce que tu as une version qui defini ce que font _Asm_fma et _Asm_fms?

a+, ld.


Avatar
Vincent Lefevre
Dans l'article <dsftf0$g78$,
Laurent Deniau écrit:

Est-ce que tu as une version qui defini ce que font _Asm_fma et _Asm_fms?


Je ne sais pas. Ça correspond respectivement à x * y + z et x * y - z,
mais je ne connais pas les rôles des premier et 5e arguments.

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / SPACES project at LORIA

Avatar
Laurent Deniau
Vincent Lefevre wrote:
Dans l'article <dsftf0$g78$,
Laurent Deniau écrit:


Est-ce que tu as une version qui defini ce que font _Asm_fma et _Asm_fms?



Je ne sais pas.


La reponse est non (et ma version non plus) parce qu'il n'y a pas de
moyen portable de detecter/activer SSE sur x86 apparement.

Ça correspond respectivement à x * y + z et x * y - z,
mais je ne connais pas les rôles des premier et 5e arguments.


jette un oeil sur crlibm_private.h

a+, ld.


1 2