Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1097 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Entre les double et les float...

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Entre les double et les float...

n°366552
fodger
ARRRACHHEE TTAAA FFFOUUFFOUNE!
Posté le 18-04-2003 à 15:30:51  profilanswer
 

On peut gagner en vitesse de traitement non dans les calculs?

mood
Publicité
Posté le 18-04-2003 à 15:30:51  profilanswer
 

n°366560
tomlameche
Et pourquoi pas ?
Posté le 18-04-2003 à 15:35:40  profilanswer
 

Fodger a écrit :

On peut gagner en vitesse de traitement non dans les calculs?


Ben a priori, puisque les doubles utilisent plus de précisions, ils demandent donc plus de mémoire et plus de précisions dans les calculs = plus de calculs => moins de performances.
Mais bon, pour voir la différence, faut déjà un sacré programme ...


---------------
Gérez votre collection de BD en ligne ! ---- Electro-jazzy song ---- Dazie Mae - jazzy/bluesy/cabaret et plus si affinité
n°366565
Taz
bisounours-codeur
Posté le 18-04-2003 à 15:40:15  profilanswer
 

à toi de faire la comparaison
 
 

Citation :

11.10 Faut-il préférer les double aux float ?
La vitesse de traitement d'un double n'est pas forcément plus longue qu'un float, cela dépend du compilateur (de ses options) et du processeur. Ainsi avec l'exemple suivant, en remplaçant le typedef par float ou double, on s'aperçoit que sur un Pentium ou un PowerPC, le double est plus rapide à calculer que le float tout en ayant une précision plus grande.
 
    #include <stdio.h>
    #include <math.h>
     
    typedef float reel;     /* float ou double */
     
    int main(void) {
        long i ;
        reel d = 3.0 ;
     
        for (i = 0; i < 100000000; i++) {
            d = cos(d) ;
        }
 
        (void)printf("%f\n", d);
        return 0;
    }
     
 
Le C comprend des instructions mathématiques pour traiter les float directement au lieu de toujours passer par des double depuis la dernière norme (C99). Par exemple il existe cosf() en plus de cos(). En faisant des essais on s'aperçoit que dans notre exemple, le cosf() appliqué à un float devient aussi rapide que le cos() appliqué à un double.
 
En conclusion, nous pouvons dire qu'il est préférable d'utiliser des double à la place des float, sauf lorsque la place mémoire devient critique.


 
 

[benoit@benserver tmp]$ gcc -lm -o float float.c  
[benoit@benserver tmp]$ gcc -lm -o double float.c  
[benoit@benserver tmp]$ time ./float; time ./double  
0.739085
 
real    0m15.723s
user    0m15.660s
sys     0m0.010s
0.739085
 
real    0m16.381s
user    0m16.330s
sys     0m0.040s


 
evidemment, faudrait le faire tourner plusieurs fois, mais tu peux voir qu'il n'y a pas de différence majeur. En fait on utilise les float pour les calculs scientifique où l'on traite beaucoup de données (pour l'anecdote, un copain traite des matrices de 10^6 * 10^6, ce qui l'interesse c'est pas d'avoir quelques chiffres de plus, mais bien d'avoir la matrice la plus garnde possible. La je t'assure, le passage de double en float ce fait sentir: il passe de 7,5To à 3,7To, c'est plus que sensible


Message édité par Taz le 18-04-2003 à 15:58:12
n°366578
tomlameche
Et pourquoi pas ?
Posté le 18-04-2003 à 15:51:00  profilanswer
 

++Taz a écrit :

Un truc tout à fait interessant


 :jap:  
Au moins j'aurai apris un truc interessant aujourd'hui.


---------------
Gérez votre collection de BD en ligne ! ---- Electro-jazzy song ---- Dazie Mae - jazzy/bluesy/cabaret et plus si affinité
n°366583
fodger
ARRRACHHEE TTAAA FFFOUUFFOUNE!
Posté le 18-04-2003 à 15:55:30  profilanswer
 

T'as choppé ça où?
 

++Taz a écrit :

à toi de faire la comparaison
 
 

Citation :

11.10 Faut-il préférer les double aux float ?
La vitesse de traitement d'un double n'est pas forcément plus longue qu'un float, cela dépend du compilateur (de ses options) et du processeur. Ainsi avec l'exemple suivant, en remplaçant le typedef par float ou double, on s'aperçoit que sur un Pentium ou un PowerPC, le double est plus rapide à calculer que le float tout en ayant une précision plus grande.
 
    #include <stdio.h>
    #include <math.h>
     
    typedef float reel;     /* float ou double */
     
    int main(void) {
        long i ;
        reel d = 3.0 ;
     
        for (i = 0; i < 100000000; i++) {
            d = cos(d) ;
        }
 
        (void)printf("%f\n", d);
        return 0;
    }
     
 
Le C comprend des instructions mathématiques pour traiter les float directement au lieu de toujours passer par des double depuis la dernière norme (C99). Par exemple il existe cosf() en plus de cos(). En faisant des essais on s'aperçoit que dans notre exemple, le cosf() appliqué à un float devient aussi rapide que le cos() appliqué à un double.
 
En conclusion, nous pouvons dire qu'il est préférable d'utiliser des double à la place des float, sauf lorsque la place mémoire devient critique.

 

n°366587
ToxicAveng​er
Tatatatakae ! Otaking !!!!!!
Posté le 18-04-2003 à 15:57:30  profilanswer
 

Fodger a écrit :

T'as choppé ça où?


 
faq de fclc


Message édité par ToxicAvenger le 18-04-2003 à 15:57:48
n°366589
bjone
Insert booze to continue
Posté le 18-04-2003 à 15:59:34  profilanswer
 

j'appelles ça un testàlacon.
 
le cos est très long en cycles cpu, une bonne centaine.
de plus si le fpu est en 80 bits ça sortira dans un registre fpu 80 bits. ensuite le cos rebouffera le même registre.
 
donc le type donné en C/C++ que ce soit float ou double sera inutilisé si le compilateur optimise le code un temps soit peu, et donc qu'il effectues la boucle dans les registres fpu et non la mémoire.
 
donc ce test a tellement de paramètres non maitrisés que ç'est pas vraiment valable:
 
pour les x86: mode de précision du fpu ?, d reste-t-il dans un registre ou est-il dégradé dans le format reel en mémoire ?
 
pour un ppc: vu qu'il me semble que le ppc n'a pas de fonction trigonométriques, quelle est l'implémentation logicielle de cos ?
 
pour les deux: cos est-il utilisé si fréquemment que c'est une instruction test valable pour dire quelle mode est le plus rapide ?

n°366594
Taz
bisounours-codeur
Posté le 18-04-2003 à 16:01:47  profilanswer
 

c'est bien ce qu'on veut dire: on s'en fout du temps de traitement, il sera sans doute le meme. La seule chose qui importe, c'est la taille des données (voir mon edit)


Message édité par Taz le 18-04-2003 à 16:02:02
n°366597
bjone
Insert booze to continue
Posté le 18-04-2003 à 16:03:05  profilanswer
 

la seule chose que l'on puisse dire, c'est que dans le cas d'un quantité massive de données, le float sera nettement plus rapide, car 2x plus petit que le double, 2x plus petit => 2x moins de bande passante mémoire pour balayer un tableau, 2x plus d'éléments dans une ligne de cache (et donc 2x moins de lignes de caches pour le même nombre d'élements)

n°366598
bjone
Insert booze to continue
Posté le 18-04-2003 à 16:03:21  profilanswer
 

++Taz a écrit :

c'est bien ce qu'on veut dire: on s'en fout du temps de traitement, il sera sans doute le meme. La seule chose qui importe, c'est la taille des données (voir mon edit)


 
oki on est d'accord ;)

mood
Publicité
Posté le 18-04-2003 à 16:03:21  profilanswer
 

n°366600
Tetragramm​aton IHVH
dieu unique =&gt; pensée unique
Posté le 18-04-2003 à 16:06:00  profilanswer
 

BJOne a écrit :

j'appelles ça un testàlacon.
 
le cos est très long en cycles cpu, une bonne centaine.
de plus si le fpu est en 80 bits ça sortira dans un registre fpu 80 bits. ensuite le cos rebouffera le même registre.
 


 
On s'en fout : y a des tables de sin/cos en dur dans les proco [:spamafote]


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
n°366601
bjone
Insert booze to continue
Posté le 18-04-2003 à 16:07:00  profilanswer
 

donc je dirais dans la pratique, pour des ressources qui seont utilisées en "lecture seule" (tableau/structure source), le float est souvant suffisant. dans des calculs intermédiaires, le double est à conseiller (et encore si des résultats intermérdiaires sont conservés dans des registres fpu, la précision peut être supérieure au double):
 
d'où une petite règle personelle simple:
 
précision temporaire >= précision finale >= précision de la source.


Message édité par bjone le 18-04-2003 à 16:07:57
n°366602
bjone
Insert booze to continue
Posté le 18-04-2003 à 16:07:33  profilanswer
 

Tetragrammaton IHVH a écrit :


 
On s'en fout : y a des tables de sin/cos en dur dans les proco [:spamafote]


 
t'a vu jouer ça où ?  :heink:

n°366607
Tetragramm​aton IHVH
dieu unique =&gt; pensée unique
Posté le 18-04-2003 à 16:15:58  profilanswer
 

BJOne a écrit :


 
t'a vu jouer ça où ?  :heink:  


 
sur ce forum.


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
n°366610
bjone
Insert booze to continue
Posté le 18-04-2003 à 16:18:44  profilanswer
 


 
non, on utilises des tables de précalcul pour aller plus vite, pour justement éviter les fonctions trigo du fpu qui sont couteuses.
 
mais le cos lui même du fpu est effectué par un algo itératif +ou- compliqué (d'où la centaine de cycles...)
 
tu ne peux pas utiliser des tables, car ça boufferai trop de rom, et en plus c'est impraticable car imprécis.
 
pour un jeu, on utilisait avant des tables de précalcul ou tes 360° était sur 256 ou 512 entrées, mais 1° de précision c'est dégueu....

n°366614
Tetragramm​aton IHVH
dieu unique =&gt; pensée unique
Posté le 18-04-2003 à 16:21:29  profilanswer
 

BJOne a écrit :


 
non, on utilises des tables de précalcul pour aller plus vite, pour justement éviter les fonctions trigo du fpu qui sont couteuses.
 
mais le cos lui même du fpu est effectué par un algo itératif +ou- compliqué (d'où la centaine de cycles...)
 
tu ne peux pas utiliser des tables, car ça boufferai trop de rom, et en plus c'est impraticable car imprécis.
 
pour un jeu, on utilisait avant des tables de précalcul ou tes 360° était sur 256 ou 512 entrées, mais 1° de précision c'est dégueu....


 
Y a deja toutes les divisions en dur, alors quelques tables de cosinus, c'est minime. Mais bon, si tu le dis.


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
n°366619
bjone
Insert booze to continue
Posté le 18-04-2003 à 16:24:09  profilanswer
 

Tetragrammaton IHVH a écrit :


 
Y a deja toutes les divisions en dur, alors quelques tables de cosinus, c'est minime. Mais bon, si tu le dis.


 
:lol:
 
les divisions en dur :??:

n°366628
fodger
ARRRACHHEE TTAAA FFFOUUFFOUNE!
Posté le 18-04-2003 à 16:27:51  profilanswer
 

Ca c'est pas mal:D...

n°366630
fodger
ARRRACHHEE TTAAA FFFOUUFFOUNE!
Posté le 18-04-2003 à 16:28:45  profilanswer
 

BJOne a écrit :

donc je dirais dans la pratique, pour des ressources qui seont utilisées en "lecture seule" (tableau/structure source), le float est souvant suffisant. dans des calculs intermédiaires, le double est à conseiller (et encore si des résultats intermérdiaires sont conservés dans des registres fpu, la précision peut être supérieure au double):
 
d'où une petite règle personelle simple:
 
précision temporaire >= précision finale >= précision de la source.


 
Pour les comparaisons d'égalité, mieux s'abstenir à cause des erreurs d'arondi.

n°366641
Taz
bisounours-codeur
Posté le 18-04-2003 à 16:34:45  profilanswer
 

vive les developpements limités

n°366642
bjone
Insert booze to continue
Posté le 18-04-2003 à 16:35:21  profilanswer
 

Fodger a écrit :


 
Pour les comparaisons d'égalité, mieux s'abstenir à cause des erreurs d'arondi.


 
heu vi mais je compare pas des variables flottantes là, je parle de précision...
 
par exemple je sais pas, pour un système lié à un terrain, tu stoques tes altitudes en short int 16 bits, pour tes calculs temporaires tu ramènes ça en float ou double et idem pour ce qui est à considérer comme calcul final.

n°366649
bjone
Insert booze to continue
Posté le 18-04-2003 à 16:41:05  profilanswer
 

++Taz a écrit :

vive les developpements limités


 
c'est un peu ça l'idée :D

n°366661
verdoux
And I'm still waiting
Posté le 18-04-2003 à 16:44:46  profilanswer
 

Le choix peut aussi être dû aux optimisations possibles avec les unités spécifiques:
Altivec et SSE n'utilisent que des floats.
SSE2 permet l'utilisation de flottants 64bits mais y en a que 2 par registre de 128 bits.

n°366765
Tetragramm​aton IHVH
dieu unique =&gt; pensée unique
Posté le 18-04-2003 à 19:10:18  profilanswer
 

BJOne a écrit :


 
:lol:
 
les divisions en dur :??:


 
Ah ouais, d'accord, je croyais que j'avais affaire à un spécialiste...
Renseigne toi un minimum avant de poster des ":lol:" à tout va.
 
Mots clés : pentium, bug, FDIV


Message édité par Tetragrammaton IHVH le 18-04-2003 à 19:10:59

---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
n°366869
bjone
Insert booze to continue
Posté le 18-04-2003 à 22:35:20  profilanswer
 

Tetragrammaton IHVH a écrit :


 
Ah ouais, d'accord, je croyais que j'avais affaire à un spécialiste...
Renseigne toi un minimum avant de poster des ":lol:" à tout va.
 
Mots clés : pentium, bug, FDIV


 
et ?  :heink:  
 
donne le lien...
 
il y a probablement des tables de précalcul utilisées dans les cpu, mais "Y a deja toutes les divisions en dur" est sujet à interprétation bizarre...

n°366875
bjone
Insert booze to continue
Posté le 18-04-2003 à 22:42:42  profilanswer
 

oki dans le cas du pentium, il y a une table de précalcul de 1066 entrées. mais le terme "Y a deja toutes les divisions en dur" n'est pas du -tout- approprié oki  :jap:
 
car même utilisant des tables de précalcul, la divsion, racine carré et la trigo utilisent des algo itératifs...


Message édité par bjone le 18-04-2003 à 22:47:21
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Entre les double et les float...

 

Sujets relatifs
Liens doubleInterception du double click
[jFileChooser] Selectionner un dossier par un double clicsimple ( ' ) ou double ( "" ) en php ?
[Delphi] Ouiiin, je veux le double-click avant le mousedownProblème de conversion de float en int
[java]float -> codage et normeExploitation d'un double free ...
Double menu déroulant dynamique[C++] (double) 0==1.3877e-016 (float) 0==7.45058e-008
Plus de sujets relatifs à : Entre les double et les float...


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR