Quels sont les avantages et les inconvénients de l'utilisation de l'un plutôt que l'autre en C++?
Réponses
Trop de publicités?Si vous voulez connaître la vraie réponse, vous devriez lire Ce que Chaque Ordinateur Scientifique Doit Savoir à Propos de l'Arithmétique à virgule Flottante.
En bref, bien qu' double
donner plus de précision dans sa représentation, pour certains types d'arithmétique qu'il donnerait plus d'erreur. Le "bon" choix: utiliser autant de précision que vous avez besoin, mais pas plus et choisir le bon algorithme.
De nombreux compilateur ne étendu calcul en virgule flottante dans la "non-stricte" mode de toute façon (c'est à dire utiliser un plus grand type à virgule flottante disponibles dans le matériel, par exemple, 80 bits et 128 bits flottant), ce qui devrait être pris en compte. -- Dans la pratique, vous pouvez à peine voir toute différente de la vitesse -- ils sont originaires de matériel de toute façon.
Sauf si vous avez une bonne raison de faire autrement, utilisez le double.
Peut-être étonnamment, il est double et pas de flotteur qui est le "normal" à virgule flottante type en C (et C++). Le standard des fonctions mathématiques telles que le péché et le journal de la prendre en double comme arguments, et de retour doubles. Une normale à virgule flottante littérale, comme lorsque vous écrivez 3.14 dans votre programme, est du type double. Ne pas flotter.
Sur les ordinateurs modernes, les doubles seront tout aussi rapides que des flotteurs, ou encore plus rapide, de sorte que la performance est généralement pas un facteur à prendre en compte, même pour les gros calculs. (Et ceux qui aurait à être de grands calculs, ou la performance ne devrait même pas entrer dans votre esprit. Mon plusieurs années-vieux bureau de l'ordinateur ajoute cinq cents millions de doubles dans une seconde.)
Cette question est impossible de répondre car il n'y a pas de contexte à la question. Voici quelques choses qui peuvent affecter le choix:
-
Compilateur de mise en œuvre de float, double et long double. La norme C++ états:
Il existe trois types à virgule flottante: float, double et long double. Le type double est au moins autant de précision que le flotteur, et le type long double offre au moins autant de précision double.
Ainsi, tous les trois peuvent être de la même taille en mémoire.
La présence de la FPU. Pas tous les Processeurs ont des Unités de police constituées et parfois de la virgule flottante types sont émulées et parfois de la virgule flottante types sont tout simplement pas pris en charge.
FPU de l'Architecture. Le IA32 de la FPU est 80bit interne 32 bits et 64 bits des flotteurs sont élargies à 80bit de la charge et la réduction sur la boutique. Il y a aussi SIMD qui peut faire quatre 32bit float ou deux 64bit flotteurs en parallèle. L'utilisation de SIMD n'est pas définie dans la norme, alors il aurait besoin d'un compilateur qui ne fait plus de complexe d'analyse afin de déterminer si SIMD peut être utilisé, ou qui nécessite l'utilisation de fonctions spéciales (bibliothèques ou intrinsèques). Le résultat de la 80bit format interne est que vous pouvez obtenir des résultats légèrement différents selon la fréquence à laquelle les données sont enregistrées dans la mémoire RAM (donc, perdre de la précision). Pour cette raison, les compilateurs ne pas optimiser du code de nombres flottants particulièrement bien.
La bande passante mémoire. Si un double nécessite plus d'espace de stockage que d'un flotteur, alors il faudra plus de temps pour lire les données. C'est la réponse naïve. Moderne IA32, tout dépend de l'endroit où les données proviennent de. Si elle est dans le cache L1, la charge est négligeable, à condition que les données proviennent que d'une seule ligne de cache. Si il s'étend sur plus d'une ligne de cache il y a une petite surcharge. Si c'est à partir de la L2, il prend un peu plus longtemps, si c'est dans la RAM alors c'est encore plus long et enfin, si c'est sur le disque c'est un temps énorme. Donc, le choix du type float ou double est moins important que la manière dont les données sont utilisées. Si vous voulez faire un petit calcul sur des lots de données séquentielles, un petit type de données est préférable. Faire beaucoup de calcul sur un petit jeu de données vous permettent d'utiliser plus de types de données avec un effet significatif. Si vous avez accès au données très au hasard, le choix de la taille des données est sans importance - chargement des données dans des pages / lignes de cache. Donc, même si vous voulez seulement un octet de la RAM, vous pourriez obtenir de 32 octets transférés (ce qui est très dépendante de l'architecture du système). Sur le dessus de tout cela, le CPU/FPU pourrait être super-scalaire (aka pipeline). Donc, même si un chargement peut prendre plusieurs cycles, le CPU/FPU pourrait être en train de faire quelque chose d'autre (une multiplication par exemple) qui cache le temps de chargement d'un degré.
La norme n'impose aucun format particulier pour les valeurs à virgule flottante.
Si vous avez un cahier des charges, puis qui va vous guider pour le choix optimal. Sinon, c'est de l'expérience de ce qu'il faut utiliser.
Double est plus précis, mais est codé sur 8 octets. le flotteur est à seulement 4 octets, donc moins de place et moins de précision.
Vous devriez être très prudent si vous avez des doubles et flotter dans votre application. J'ai eu un bug dû à ce que dans le passé. Une partie du code a été à l'aide de flotter, alors que le reste du code en utilisant le double. La copie double, float, puis flotter à double peut provoquer des erreurs de précision qui peut avoir un grand impact. Dans mon cas, c'était une usine de produits chimiques... espérons qu'il n'avait pas des conséquences dramatiques :)
Je pense que c'est à cause de ce genre de bug que la fusée Ariane 6 a explosé il y a quelques années!!!
Réfléchir sur le type à être utilisé pour une variable