Autres conseils

Sauf si vous avez une bonne raison de faire autrement, utiliser le double.

Peut-être de manière surprenante, il est double et pas flotter qui est la « normale » de type à virgule flottante en C (et C ++). Les fonctions mathématiques standard telles que sin et log prendre en double comme arguments, et le retour en double. Une normale à virgule flottante littéral, comme lorsque vous écrivez 3,14 dans votre programme, a le type double. Ne flotte pas.

Sur les ordinateurs modernes typiques, doubles peuvent être tout aussi rapide que flotteurs, ou encore plus rapide, donc la performance est généralement pas un facteur à considérer, même pour les grands calculs. (Et ceux faudrait être grand calculs ou la performance ne devrait même pas entrer dans votre esprit. Mon nouvel ordinateur de bureau peut faire six Core i7 milliards multiplications de doubles en une seconde.)

Cette question est impossible de répondre car il n'y a pas de contexte à la question. Voici quelques choses qui peuvent avoir une incidence sur le choix:

  1. Mise en oeuvre du compilateur de flotteurs, doubles et doubles longues. La norme C +:

      

    Il existe trois types de virgule flottante: float, double et long double. Le double de type fournit au moins autant de précision que flotteur et le type long double offre au moins autant de précision que double.

    Alors, tous les trois peuvent être de la même taille dans la mémoire.

  2. Présence d'un FPU. Tous les processeurs ont FPU et parfois les types à virgule flottante sont émulés et parfois les types à virgule flottante sont tout simplement pas pris en charge.

  3. FPU architecture. La FPU est de IA32 interne 80 bits - 32 bits et 64 bits flotteurs sont étendus à 80 bits de la charge et réduit le magasin. Il y a aussi SIMD qui peut faire quatre flotteurs 32bit ou deux flotteurs 64bit en parallèle. L'utilisation de SIMD n'est pas défini dans la norme il aurait besoin d'un compilateur qui fait une analyse plus complexe pour déterminer si SIMD peut être utilisé, ou nécessite l'utilisation de fonctions spéciales (bibliothèques ou) intrinsèques. Le résultat du format interne est que vous 80 bits pouvez obtenir des résultats légèrement différents en fonction de la fréquence à laquelle les données sont enregistrées dans la RAM (donc, perte de précision). Pour cette raison, les statisticiens ne. Pas optimiser le code à virgule flottante particulièrement

  4. La bande passante mémoire. Si un double nécessite plus de stockage que d'un flotteur, il faudra plus de temps pour lire les données. Voilà la réponse naïve. Sur un IA32 moderne, tout dépend de l'endroit où les données proviennent de. Si elle est dans le cache L1, la charge est fourni négligeable les données proviennent d'une seule ligne de cache. Si elle couvre plus d'une ligne de cache, il y a une petite surcharge. Si elle est de L2, il faut un peu plus longtemps, si elle est dans la RAM, alors il est plus encore et enfin, si elle est sur le disque, il est un temps énorme. Ainsi, le choix du flotteur ou double est moins important que la façon 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 ensemble de données vous permettra d'utiliser de plus grands types de données avec un effet significatif. Si vous accédez à des données très au hasard, le choix de la taille des données est sans importance - les données sont chargées dans les pages / lignes de cache. Donc, même si vous voulez seulement un octet de RAM, vous pouvez obtenir 32 octets transférés (ce qui est très dépendante de l'architecture du système). En plus de tout cela, la CPU / FPU pourrait être super-scalaire (aka pipe-line). Ainsi, même si une charge peut prendre plusieurs cycles, la CPU / FPU pourrait être occupé à faire autre chose (une multiplication par exemple) qui cache le temps de chargement à un degré.

  5. La norme n'impose pas un format particulier pour les valeurs à virgule flottante.

Si vous avez une spécification, puis qui vous guidera vers le choix optimal. Dans le cas contraire, il est en bas de l'expérience à ce qu'il faut utiliser.

Double est plus précis mais est codé sur 8 octets. flotteur est seulement 4 octets, donc moins de place et moins de précision.

Vous devriez être très prudent si vous avez double et flottant dans votre application. J'ai eu un bug à cause que dans le passé. Une partie du code utilisait flotteur tandis que le reste du code utilisait double. Copie double pour flotter puis flotter à double peut provoquer des erreurs de précision qui peut avoir grand impact. Dans mon cas, il était une usine chimique ... espérons qu'il n'a pas eu des conséquences dramatiques:)

Je pense qu'il est à cause de ce genre de bug que la fusée Ariane 6 a explosé il y a quelques années !!!

Réfléchissez bien sur le type à utiliser pour une variable

Je vais personnellement pour doubler tout le temps jusqu'à ce que je vois des goulots d'étranglement. Ensuite, j'envisager de passer à flotter ou d'optimiser une autre partie

Cela dépend de la façon dont le compilateur implémente double. Il est légal pour le double et flotteur pour être du même type (et il est sur certains systèmes).

Cela étant dit, si elles sont bien différentes, la question principale est la précision. Un double a une précision beaucoup plus élevé en raison de sa différence de taille. Si les chiffres que vous utilisez sera généralement supérieure à la valeur d'un flotteur, puis utiliser un double.

Plusieurs autres personnes ont mentionné isssues de performance. Ce serait exactement dernier sur ma liste de considérations. Devrait être votre exactitude compte # 1.

utilisation selon la précision est nécessaire pour atteindre les résultats appropriés. Si vous trouvez alors que votre code ne fonctionne pas aussi bien que vous le souhaitez (vous avez utilisé le profilage correct?) Jeter un oeil à:

Je pense que quelles que soient les différences (qui, comme tout le monde fait remarquer, flotteurs prennent moins de place et sont en général plus rapide) ... personne ne souffre jamais des problèmes de performance en utilisant le double? Je dis dans une double ... et si plus tard vous décidez « wow, c'est vraiment lent » ... trouver votre goulot d'étranglement (ce qui est probablement pas le fait que vous avez utilisé double). ALORS, si elle est encore trop lent pour vous, voir où vous pouvez sacrifier une certaine précision et utiliser float.

La principale différence entre flotteur et double précision est. Wikipedia a plus d'informations sur simple précision (float) et Double précision .

Il dépend fortement de la CPU les compromis les plus évidents sont entre la précision et la mémoire. Avec Go de RAM, la mémoire n'est pas vraiment un problème, il est généralement préférable d'utiliser s double.

En ce qui concerne la performance, il dépend fortement de la CPU. S sera généralement float obtenir de meilleures performances que sur une s <=> la machine 32 bits. Sur 64 bits, s sont parfois <=> plus vite, car il est (généralement) la taille native. Pourtant, ce qui importe beaucoup plus que votre choix de types de données est de savoir si oui ou non vous pouvez tirer parti des instructions SIMD sur votre processeur.

double a une plus grande précision, alors que les flotteurs prennent moins de mémoire et sont plus rapides. En général, vous devez utiliser flotteur sauf si vous avez un cas où il ne suffit pas précise.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top