web-dev-qa-db-fra.com

Quand utilisez-vous float et quand utilisez-vous double

Souvent, dans mon expérience de programmation, je dois décider si je dois utiliser float ou double pour mes vrais nombres. Parfois, je vais pour le flotteur, parfois je vais pour le double, mais vraiment cela semble plus subjectif. Si j'étais confronté pour défendre ma décision, je ne donnerais probablement pas de bonnes raisons.

Quand utilisez-vous float et quand utilisez-vous double? Utilisez-vous toujours le double, uniquement lorsque les contraintes de mémoire sont présentes, vous optez pour float? Ou vous utilisez toujours float sauf si l'exigence de précision vous oblige à utiliser le double? Existe-t-il des différences substantielles concernant la complexité de calcul des arithmétiques de base entre float et double? Quels sont les avantages et les inconvénients de l'utilisation de float ou double? Et avez-vous même utilisé un double long?

199
Jakub Zaverka

Le choix par défaut pour un type à virgule flottante doit être double. C'est é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 devez opérer sur un grand nombre de nombres à virgule flottante (pensez dans l'ordre de milliers ou plus) et l'analyse de l'algorithme a montré que la portée et la précision réduites ne posent pas un problème.

long double peut être utilisé si vous avez besoin de plus de portée ou de précision que double, et s'il le fournit sur votre plate-forme cible.

En résumé, float et long double doit être réservé à l'usage des spécialistes, avec double pour une utilisation "quotidienne".

191

Il y a rarement lieu d'utiliser float au lieu de double dans le code ciblant les ordinateurs modernes. La précision supplémentaire réduit (mais n'élimine pas) le risque d'erreurs d'arrondi ou d'autres imprécisions à l'origine de problèmes.

Les principales raisons pour lesquelles je peux penser à utiliser float sont:

  1. Vous stockez de grands tableaux de nombres et devez réduire la consommation de mémoire de votre programme.
  2. Vous ciblez un système qui ne prend pas en charge nativement la virgule flottante double précision. Jusqu'à récemment, de nombreuses cartes graphiques ne prenaient en charge que les virgules flottantes à simple précision. Je suis sûr qu'il existe de nombreux processeurs basse consommation et intégrés qui prennent également en charge la virgule flottante limitée.
  3. Vous ciblez du matériel où la simple précision est plus rapide que la double précision, et votre application fait un usage intensif de l'arithmétique à 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.
  4. Vous effectuez une optimisation de bas niveau, par exemple en utilisant des instructions CPU spéciales qui fonctionnent sur plusieurs numéros à la fois.

Donc, fondamentalement, le double est la voie à suivre, sauf si vous avez des limitations matérielles ou si l'analyse n'a pas montré que le stockage de nombres en double précision contribue de manière significative à l'utilisation de la mémoire.

42
user611910

Utilisez double pour tous vos calculs et variables temporaires. Utilisez float lorsque vous devez gérer un tableau de nombres - float[] (si la précision est suffisante), et vous avez affaire à plus de dizaines de milliers de nombres float.

Beaucoup/la plupart des fonctions ou opérateurs mathématiques convertissent/renvoient double, et vous ne voulez pas convertir les nombres en float pour des étapes intermédiaires.

Par exemple. Si vous avez une entrée de 100 000 numéros à partir d'un fichier ou d'un flux et que vous devez les trier, mettez les numéros dans un float[].

10
Fai Ng

Certaines plates-formes (ARM Cortex-M2, Cortex-M4, etc.) ne prennent pas en charge double (Cela peut toujours être vérifié dans le manuel de référence de votre processeur. S'il n'y a aucun avertissement ou erreur de compilation, cela ne signifie pas que le code est optimal. double peut être émulé.). C'est pourquoi vous devrez peut-être vous en tenir à int ou float .

Si ce n'est pas le cas, j'utiliserais double .

Vous pouvez consulter le célèbre article de D. Goldberg ("Ce que tout informaticien devrait savoir sur l'arithmétique à virgule flottante"). Vous devriez réfléchir à deux fois avant d'utiliser l'arithmétique à virgule flottante. Il y a de fortes chances qu'ils ne soient pas du tout nécessaires dans votre situation particulière.

http://perso.ens-lyon.fr/jean-michel.muller/goldberg.pdf

5
staroselskii

Pour les problèmes réels, le seuil d'échantillonnage de vos données est important pour répondre à cette question. De même, le bruit de fond est également important. Si l'un ou l'autre est dépassé par votre sélection de type de données, aucun avantage ne résultera d'une augmentation de la précision.

La plupart des échantillonneurs du monde réel sont limités à des DAC 24 bits. Suggérant que 32 bits de précision dans les calculs du monde réel devraient être adéquats lorsque la signification est de 24 bits de précision.

La double précision se fait au prix d'une mémoire 2x. Par conséquent, la limitation de l'utilisation de doubles sur flottants pourrait réduire considérablement l'empreinte mémoire/la bande passante des applications en cours d'exécution.

3
user3034617