Fréquemment dans mon expérience de programmation, jai besoin de décider si je dois utiliser float ou double pour mon vrai Nombres. Parfois, je vais pour le flotteur, parfois je vais pour le double, mais cest vraiment plus subjectif. Si je devais être confronté pour défendre ma décision, je ne donnerais probablement pas de raisons valables.
Quand utilisez-vous float et quand utilisez-vous double? Utilisez-vous toujours double, seulement lorsque des contraintes de mémoire sont présentes, vous optez pour float? Ou vous utilisez toujours float sauf si lexigence de précision vous oblige à utiliser double? Existe-t-il des différences substantielles concernant la complexité de calcul de larithmétique de base entre float et double? Quels sont les avantages et les inconvénients de lutilisation du flotteur ou du double? Et avez-vous même utilisé un long double?
Commentaires
- Dans de nombreux cas, vous ne voulez utiliser ni lun ni lautre, mais plutôt un type décimal flottant ou virgule fixe. Les types binaires à virgule flottante peuvent ‘ représenter exactement la plupart des décimales.
- Lié à Quest-ce qui cause les erreurs darrondi en virgule flottante ? . @CodesInChaos ma réponse propose des ressources pour vous aider à prendre cette décision, il ny a pas de solution unique .
- Quentendez-vous exactement par » décimales « . Si vous avez besoin de représenter exactement des valeurs telles que 0,01 (par exemple, pour de largent), alors la virgule flottante (binaire) nest pas la réponse. Si vous voulez simplement dire des nombres non entiers, alors la virgule flottante est probablement ok – mais alors » decimals » nest pas le meilleur mot pour décrire ce dont vous avez besoin.
- Étant donné que (à ce jour) la plupart des cartes graphiques acceptent les flottants plutôt que les doubles, la programmation graphique utilise souvent la simple précision.
- Vous ne ‘ Jai toujours le choix. Par exemple, sur la plate-forme Arduino, double et float équivalent à float. Vous devez trouver une bibliothèque de compléments pour gérer les vrais doubles.
Answer
Le choix par défaut pour un le type à virgule flottante doit être double
. Cest également le type que vous obtenez avec des littéraux à virgule flottante sans suffixe ou (en C) des fonctions standard qui fonctionnent sur des nombres à virgule flottante (par exemple exp
, sin
, etc.).
float
ne doit être utilisé que si vous avez besoin dopérer sur un grand nombre de nombres à virgule flottante (pensez à lordre des milliers ou plus) et lanalyse de lalgorithme a montré que la réduction de la portée et de la précision ne pose pas de problème.
long double
peut être utilisé si vous avez besoin de plus de portée ou de précision que double
, et sil fournit cela sur votre plate-forme cible.
En résumé, float
et long double
doivent être réservés à lusage des spécialistes, avec double
pour une utilisation « tous les jours ».
Commentaires
- Je ne considérerais probablement pas float pour quelques milliers de valeurs à moins quil y ait un problème de performances lié à la mise en cache en virgule flottante g et transfert de données. Il y a généralement un coût substantiel à faire lanalyse pour montrer que float est suffisamment précis.
- En complément, si vous avez besoin de compatibilité avec dautres systèmes, il peut être avantageux dutiliser les mêmes types de données.
- Jutilise ‘ des flottants pour des millions de nombres, pas des milliers. En outre, certains GPU font mieux avec les flotteurs, dans ce cas spécialisé, ils utilisent des flotteurs. Sinon, comme vous le dites, utilisez des doubles.
- @PatriciaShanahan – ‘ problème de performances lié à .. ‘ A Un bon exemple est que si vous prévoyez dutiliser SSE2 ou des instructions vectorielles similaires, vous pouvez faire 4 opérations / vecteur en float (contre 2 par double), ce qui peut donner une amélioration significative de la vitesse (moitié moins dopérations et moitié moins de données à lire & écriture). Cela peut réduire considérablement le seuil où lutilisation de flottants devient attrayante et vaut la peine de résoudre les problèmes numériques.
- Japprouve cette réponse avec un conseil supplémentaire: lorsque lon utilise des valeurs RVB pour laffichage, cela est acceptable dutiliser
float
(et parfois la demi-précision) car ni lœil humain, ni lécran, ni le système de couleurs nont autant de bits de précision. Ce conseil est applicable par exemple pour OpenGL etc. Ce conseil supplémentaire ne sapplique pas aux images médicales, qui ont des exigences de précision plus strictes.
Réponse
Il y a rarement lieu dutiliser float au lieu de doubler dans le code ciblant les ordinateurs modernes. La précision supplémentaire réduit (mais nélimine pas) le risque derreurs darrondi ou dautres imprécisions causant des problèmes.
Les principales raisons auxquelles je peux penser pour utiliser float sont:
- Vous stockez de grands tableaux de nombres et avez besoin de réduire la consommation de mémoire de votre programme.
- Vous ciblez un système qui ne prend pas nativement en charge la virgule flottante double précision. Jusquà récemment, de nombreuses cartes graphiques ne supportaient que les virgules flottantes à simple précision. Je suis sûr quil existe de nombreux processeurs à faible consommation et embarqués qui prennent également en charge la virgule flottante limitée.
- Vous ciblez du matériel où la simple précision est plus rapide que la double précision, et votre application est très utilisée darithmétique en virgule flottante. Sur les processeurs Intel modernes, je crois que tous les calculs en virgule flottante sont effectués en double précision, donc vous ne gagnez rien ici.
- Vous effectuez une optimisation de bas niveau, par exemple en utilisant des instructions CPU spéciales qui fonctionnent sur plusieurs nombres à la fois.
Donc, fondamentalement, doubler est le moyen allez à moins que vous ayez des limitations matérielles ou que lanalyse ait montré que le stockage de nombres à double précision contribue de manière significative à lutilisation de la mémoire.
Commentaires
- » Ordinateurs modernes » signifiant processeurs Intel x86. Certaines des machines utilisées par les Anciens ont fourni une précision parfaitement adéquate avec le type à flotteur de base. (Le CDC 6600 utilisait un mot de 60 bits, 48 bits de mantisse à virgule flottante normalisée, 12 bits dexposant. Cela ‘ est PRESQUE ce que le x86 vous donne pour une double précision.)
- @ John.R.Strohm: daccord, mais les compilateurs C nexistaient pas sur CDC6600. Cétait Fortran IV …
- Par » ordinateurs modernes » Je veux dire tout processeur construit au cours de la dernière décennie ou deux, ou vraiment, puisque la norme de virgule flottante IEEE a été largement mise en œuvre. Je ‘ je suis parfaitement conscient de lexistence darchitectures non x86 et javais cela à lesprit avec ma réponse – jai mentionné les GPU et les processeurs embarqués, qui ne sont généralement pas x86.
- Ce ‘ est tout simplement faux, cependant. SSE2 peut manipuler 4 flotteurs ou 2 doubles en une seule opération, AVX peut manipuler 8 flotteurs ou 4 doubles, AVX-512 peut manipuler 16 flotteurs ou 8 doubles. Pour tout type de calcul haute performance, les mathématiques sur les flottants doivent être considérées comme deux fois la vitesse des mêmes opérations sur les doubles sur x86.
- Et cela ‘ s Pire encore, puisque vous pouvez insérer deux fois plus de flotteurs dans le cache du processeur que vous le pouvez avec des doubles, et la latence de la mémoire est susceptible dêtre le principal goulot détranglement dans de nombreux programmes. Garder au chaud tout un ensemble de flotteurs de travail dans le cache peut être littéralement un ordre de grandeur plus rapide que dutiliser des doubles et de les envoyer vers la RAM.
Réponse
Utilisez double
pour tous vos calculs et variables temporaires. Utilisez float
lorsque vous avez besoin de gérer un tableau de nombres – float[]
(si la précision est suffisante), et que vous avez affaire à plus de dizaines de des milliers de float
nombres.
La plupart / la plupart des fonctions ou opérateurs mathématiques convertissent / renvoient double
, et vous ne le faites pas » t souhaitez convertir les nombres en float
pour les étapes intermédiaires.
Par exemple, si vous avez une entrée de 100 000 nombres à partir dun fichier ou dun flux et que vous devez triez-les, mettez les nombres dans un float[]
.
Réponse
Certaines plateformes (ARM Cortex-M2, Cortex-M4 etc) ne supporte pas double (Cela peut toujours être vérifié dans le manuel de référence à votre processeur. Sil ny a aucun avertissement ou erreur de compilation, cela ne signifie pas que le code est optimal. double peut être émulé .). Cest pourquoi vous devrez peut-être vous en tenir à int ou float .
Si ce nest pas le cas, jutiliserais double .
Vous pouvez consulter le célèbre article de D. Goldberg (« Ce que tout informaticien devrait savoir sur larithmétique à virgule flottante »). Vous devriez réfléchir à deux fois avant dutiliser larithmétique à virgule flottante. Il y a de fortes chances quils ne soient pas du tout nécessaires dans votre situation particulière.
http://perso.ens-lyon.fr/jean-michel.muller/goldberg.pdf
Commentaires
- Cette question a déjà été assez bien répondue il y a un an …mais dans tous les cas, je ‘ d dire chaque fois que vous ‘ utilisez double sur les plates-formes avec une accélération FPU double précision, vous devriez utiliser il sur nimporte quel autre, même si cela signifie laisser le compilateur lémuler au lieu de profiter dun FPU à virgule flottante uniquement (notez que FPU ‘ est ‘ t requis sur toutes les plates-formes non plus, en fait une architecture Cortex-M4 les définit comme une fonctionnalité facultative [M2 était-il une faute de frappe?]).
- La clé de cette logique est, alors que il ‘ est vrai quil faut être las de larithmétique à virgule flottante, et il ‘ est beaucoup » quirks « , ne prenant certainement pas la présence du support FPU pour les doubles pour signifier simplement utiliser des doubles au lieu de flottants. Les flotteurs sont généralement plus rapides que les doubles et prennent moins de mémoire (les fonctionnalités du FPU varient). Le volume dutilisation empêche ce point dêtre sur une optimisation prématurée. Tout comme le fait, les doubles sont clairement exagérés pour de nombreuses applications (peut-être même la plupart). Les éléments de cette page doivent-ils vraiment avoir leurs positions et tailles relatives calculées avec 13 décimales?
- Lorsque vous ajoutez un lien vers une page ou un document hors site, veuillez copier le des informations pertinentes, ou un résumé, du document à votre réponse. Les liens hors site ont tendance à disparaître avec le temps.
Réponse
Pour les problèmes du monde réel, le seuil déchantillonnage de vos données sont importantes pour répondre à cette question. De même, le plancher de bruit est également important. Si lun ou lautre est dépassé par votre sélection de type de données, il ny aura aucun avantage à augmenter la précision.
La plupart des échantillonneurs du monde réel sont limités aux DAC 24 bits. Suggérer que 32 bits de précision sur les calculs du monde réel devraient être adéquats lorsque le significande est de 24 bits de précision.
La double précision se fait au prix de 2x la mémoire. Par conséquent, limiter lutilisation des doubles par rapport aux flottants pourrait réduire considérablement lempreinte mémoire / la bande passante des applications en cours dexécution.
Réponse
Le choix de la variable à utiliser entre float et double dépend de la précision des données requises. Si une réponse doit avoir une différence négligeable par rapport à la réponse réelle, le nombre de décimales requises sera élevé, ce qui dictera ce double à utiliser.Float coupera une partie des décimales, réduisant ainsi la précision.
Commentaires
- Cette réponse najoute ‘ rien de nouveau à la question et ne dit rien de réel.
Réponse
En général, jutilise le type float
lorsque Je nai pas besoin de beaucoup de précision – par exemple, pour de largent – ce qui est faux, mais cest ce que « jai lhabitude de faire à tort.
Par contre, jutilise double
lorsque jai besoin de plus de précision, par exemple pour des algorithmes mathématiques complexes.
La norme C99 dit ceci:
Il existe trois types de virgule flottante: float, double et long double. Le type double fournit au moins autant de précision que float, et le type long double fournit au moins autant de précision que double. Lensemble de valeurs de type float est un sous-ensemble de lensemble de valeurs de type double; lensemble de valeurs de type double est un sous-ensemble de lensemble de valeurs de type long double.
Je nai jamais vraiment utilisé long double
, mais je nutilise pas tellement C / C ++. Habituellement, jutilise des langages typés dynamiquement comme Python, où vous navez pas à vous soucier des types.
Pour plus dinformations sur Double vs Float , consultez cette question à SO .
Commentaires
- Utiliser la virgule flottante pour les calculs dargent sérieux est probablement une erreur.
- float est exactement le mauvais type pour largent. Vous devez utiliser la plus grande précision possible.
- @BartvanIngenSchenau La virgule flottante pour largent est généralement acceptable, la virgule flottante binaire ne lest pas. Par exemple .net ‘ s
Decimal
est un type à virgule flottante et il ‘ est généralement un bon choix pour les calculs dargent. - @ChrisF Vous navez ‘ pas besoin de » haute précision » pour de largent, vous avez besoin de valeurs exactes.
- @SeanMcSomething – Bon point. Cependant, les flottants sont toujours du mauvais type et étant donné les types à virgule flottante disponibles dans la plupart des langues, vous avez besoin de » haute précision » pour obtenir » valeurs exactes « .