Avertissement (comme suggéré par Toby Speight): Bien que la norme IEEE 754 représentations sont assez fréquents, et une mise en œuvre est autorisé à utiliser toute autre représentation qui satisfait aux exigences de la langue.
Les doubles sont représentés sous la forme mantissa * 2^exponent
, c'est à dire une partie des bits sont utilisés pour les non-partie entière du nombre double.
bits range precision
float 32 1.5E-45 .. 3.4E38 7- 8 digits
double 64 5.0E-324 .. 1.7E308 15-16 digits
long double 80 1.9E-4951 .. 1.1E4932 19-20 digits
La partie de la fraction peut également être utilisé pour représenter un nombre entier à l'aide d'un exposant qui supprime tous les chiffres après la virgule.
E. g. 2,9979 · 10^4 = 29979.
Depuis un commun int
est généralement de 32 bits, vous pouvez représenter tous int
s comme double, mais pour les entiers 64 bits bien sûr, ce n'est plus vrai. Pour être plus précis (comme LThode a fait remarquer dans un commentaire): la norme IEEE 754 double précision peut garantir ce jusqu'à 53 bits (52 bits de significande + l'implicite leader de 1 bit).
Réponse: oui pour la version 32 bits entiers, pas pour de 64 bits entiers.
(C'est correct pour le serveur/ordinateur de bureau à usage général CPU environnements, mais d'autres architectures peuvent se comporter différemment.)
Réponse pratique comme Malcom McLean: 64 bits double sont un suffisant de type entier pour presque tous les nombres entiers qui sont susceptibles de compter les choses dans la vraie vie.
Pour ce qui est empiriquement incliné, essayez ceci:
#include <iostream>
#include <limits>
using namespace std;
int main() {
double test;
volatile int test_int;
for(int i=0; i< std::numeric_limits<int>::max(); i++) {
test = i;
test_int = test;
// compare int with int:
if (test_int != i)
std::cout<<"found integer i="<<i<<", test="<<test<<std::endl;
}
return 0;
}
Le succès temps: 0.85 mémoire: 15240 signal:0
Subquestion:
Concernant la question pour les fractions de différences. Est-il possible d'avoir un nombre entier qui correspond à un double qui est juste à côté de la valeur correcte par une fraction, mais qui reconvertit à la même entier en raison de l'arrondissement?
La réponse est non, parce que tout entier qui convertit en arrière et en avant à la même valeur, représente en fait la même valeur entière en double. Pour moi, le simplemost explication (suggéré par ilkkachu) pour cela est que l'utilisation de l'exposant 2^exponent
la largeur doit toujours être une puissance de deux. Par conséquent, au-delà de la plus grande 52(+1 signe) bits entier, il n'y a jamais deux valeurs à une distance inférieure à 2, ce qui résout l'arrondissement problème de.