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?
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".
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:
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.
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[]
.
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.
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.