Différence entre le flotteur et le double - Lequel dois-je utiliser? Différence entre

Anonim

(Note: Cet article suppose que les lecteurs connaissent les rudiments de l'informatique)

De nombreux programmeurs débutants / étudiants inscrits en informatique posent les questions fréquemment posées qui concernent le domaine particulier de l'informatique qu'ils étudient. La plupart des cours pour débutants commencent par les sujets du système numérique utilisé dans les ordinateurs modernes, y compris les binaires , décimales , octales et hexadécimales < système. Ce sont les formats de numéros d'ordinateur qui sont les représentations internes des valeurs numériques dans les ordinateurs (ou les calculatrices et tout autre type d'ordinateurs numériques). Ces valeurs sont stockées en tant que "regroupement de bits". Comme nous le savons, les ordinateurs représentent des données dans des ensembles de chiffres binaires (c'est-à-dire dans la combinaison de

1s

et 0s , tels que 1111 représente 15 dans le système décimal), il est logique d'enseigner les différents formats numériques utilisés pour représenter une plage dynamique de valeurs, car ils constituent les blocs de base du calcul / traitement numérique dans tout type d'opération. Une fois que le système de nombres est défini dans la salle de classe (souvent mal), les étudiants sont tentés de passer aux différents formats de nombres du même type (ie, arithmétique en virgule flottante ). Ainsi, ils sont obligés d'apprendre les nuances entre certains types. Deux des types de données les plus couramment utilisés sont Float et Double , et alors qu'ils ciblent les mêmes besoins (ie, arithmétique en virgule flottante ), il y a une différence dans leur représentation interne et leur effet global sur le calcul du programme. Il est regrettable que de nombreux programmeurs manquent les nuances entre les types de données Flat et Double, et finissent par en abuser dans des endroits où ils ne devraient pas être utilisés en premier lieu. En fin de compte, il en résulte des erreurs de calcul dans d'autres parties du programme.

Dans cet article, je vais vous dire la différence entre float et double avec les exemples de code en langage de programmation C. Commençons!

Float vs Double … Quel est le problème?

Float et Double sont les représentations de données utilisées pour les opérations arithmétiques en virgule flottante, pensez aux nombres décimaux que vous calculez dans la classe de mathématiques, tels que

20. 123

, 16. 23 , 10. 2 , etc., ils ne sont pas des nombres entiers (c'est-à-dire 2 , 5 , 15 , etc.), ils nécessitent donc fractions dans le binaire. En tant que nombres décimaux résultants (par exemple, 20 123 , 16 23 , etc.) ne peut pas être facilement représenté avec un format binaire normal (par exemple, Integer). La principale différence entre Float et Double est que les premières sont des données à virgule flottante à simple précision (32 bits), alors que les secondes sont des données à virgule flottante à double précision (64 bits). Le double est appelé "double" car il s'agit essentiellement d'une version double précision de Float. Si vous calculez un montant énorme (pensez aux milliers de 0 dans le nombre), alors les inexactitudes seront plus petites dans le Double et vous ne perdrez pas beaucoup de précision.

Il est préférable d'élaborer en utilisant les exemples de code. Ce qui suit est l'opération sur Float et Double grâce aux fonctions mathématiques fournies en langage C:

#include

int main () {

float num1 = 1. f / 82;

float num2 = 0;

pour (int i = 0; i <738; ++ i)

num2 + = num1;

printf ("%. 7g n", num2);

double num3 = 1. 0/82;

double num4 = 0;

pour (int i = 0; i <738; ++ i)

num4 + = num3;

printf ("%.15g n", num4);

getchar ();

}

Il imprime ce qui suit:

9. 000031

8. 99999999999983

Ici, vous pouvez voir que la légère différence dans la précision de Float et Double donne une réponse complètement différente, bien que Double semble être plus précis que Float.

Voici l'exemple de la fonction sqrt () dans C:

#include

#include

int main () {

float num1 = sqrt (2382719676512365, 1230112312312312)

double num2 = sqrt (2382719676512365, 1230112312312312);

printf ("% f n", num1);

printf ("% f n", num2);

getchar ();

}

Il donne la sortie suivante:

48813108. 000000

48813109. 678778

Ici, vous pouvez voir que la réponse dans Double a une meilleure précision.

Dans l'ensemble, il est préférable d'utiliser Double pour l'arithmétique à virgule flottante, car plusieurs fonctions mathématiques standard en C fonctionnent sur les ordinateurs doubles et modernes sont extrêmement rapides et efficaces pour les calculs à double virgule flottante. Cela conduit à réduire le besoin d'utiliser Float, sauf si vous avez besoin d'utiliser beaucoup de nombres à virgule flottante (pensez aux grands tableaux avec des milliers de 0 dans les nombres) ou si vous opérez sur un système qui ne prend pas en charge le double précision à virgule flottante, autant de GPU, de périphériques de faible puissance et de certaines plates-formes (ARM Cortex-M2, Cortex-M4, etc.) ne supportent pas encore Double, alors vous devriez utiliser Float. De plus, une chose à retenir est que certains GPU / CPU fonctionnent mieux / efficacement dans le traitement Float, comme dans le calcul des vecteurs / matrices, donc vous devrez peut-être consulter le manuel / documentation de spécification du matériel pour décider lequel utiliser pour une machine particulière.

Il y a rarement une raison d'utiliser Float au lieu de Double dans le code ciblant les ordinateurs modernes. La précision supplémentaire dans Double réduit, mais n'élimine pas, le risque d'erreurs d'arrondi ou d'autres imprécisions pouvant causer des problèmes dans d'autres parties du programme. De nombreuses fonctions mathématiques ou opérateurs convertissent et renvoient Double, vous n'avez donc pas besoin de renvoyer les nombres à Float, car cela risque de perdre la précision.Pour une analyse détaillée sur l'arithmétique à virgule flottante, je vous recommande fortement de lire cet article génial (//docs.oracle.com/cd/ E19957-01 / 806-3568 / ncg_goldberg.html).

Résumé

Alors … en un mot:

Endroits où vous devriez utiliser Float:

Si vous ciblez du matériel où la précision simple est plus rapide que la double précision.

Votre application fait un usage intensif de l'arithmétique en virgule flottante, comme des milliers de nombres avec des milliers de 0.

  • Vous faites une optimisation de très bas niveau. Par exemple, vous utilisez des instructions CPU spéciales (par exemple, SSE, SSE2, AVX, etc.) qui fonctionnent sur plusieurs nombres / matrices / vecteurs à la fois.
  • Conclusion
Dans cet article j'ai mis en évidence la différence entre Float et Double, et celle qui devrait être utilisée dans des endroits spécifiques. Sans doute, il est préférable d'utiliser aveuglément Double dans la plupart des endroits, surtout si vous ciblez des ordinateurs modernes, car les chances de faible rendement dues à l'utilisation de l'arithmétique en virgule flottante double sont hautement improbables. Si vous avez des questions, vous pouvez demander dans la section des commentaires ci-dessous!