Maison >développement back-end >C++ >Toutes les valeurs entières peuvent-elles être parfaitement représentées sous forme de doubles ?
Toutes les valeurs entières sont-elles parfaitement représentées sous forme de doubles ?
La question se pose de savoir si toutes les valeurs entières sont garanties d'avoir une représentation parfaite comme nombres à virgule flottante double précision. Pour répondre à cette question, nous examinons d'abord la représentation des doubles.
Les doubles sont représentés par une mantisse * 2^exposant, où la mantisse comprend des chiffres fractionnaires. Cela permet la représentation de valeurs entières et décimales.
Représentation d'entiers de 32 bits
Pour les entiers de 32 bits, jusqu'à 53 bits sont disponibles pour la mantisse. Ceci est suffisant pour représenter tous les entiers possibles de 32 bits sans perte fractionnaire. Ainsi, oui, toutes les valeurs entières de 32 bits sont parfaitement représentées sous forme de doubles.
Représentation des entiers de 64 bits
Cependant, pour les entiers de 64 bits, la situation est différent. La double précision IEEE 754 peut garantir une représentation parfaite jusqu'à 53 bits. Au-delà, il peut y avoir des erreurs d’arrondi. Par conséquent, non, toutes les valeurs entières de 64 bits ne sont pas parfaitement représentées sous forme de doubles.
Vérification empirique du comportement
L'extrait de code suivant teste la conversion d'entiers en doubles :
<code class="cpp">#include <iostream> #include <limits> using namespace std; int main() { double test; volatile int test_int; for (int i = 0; i < numeric_limits<int>::max(); i++) { test = i; test_int = test; if (test_int != i) cout << "found integer i=" << i << ", test=" << test << endl; } return 0; }</code>
L'exécution de ce code révèle qu'il n'y a pas de valeurs entières avec des erreurs de conversion fractionnaire pour les entiers 32 bits. Cependant, pour les entiers de 64 bits, il est possible de trouver des valeurs entières qui se convertissent en doubles avec des différences fractionnaires et arrondissent à la valeur entière d'origine.
Différences fractionnaires
Concernant la possibilité de différences fractionnaires lors de la conversion, la réponse est toujours non pour les entiers. En effet, la largeur de pas entre les valeurs doubles représentée sous la forme d'une mantisse * 2 ^ exposant est toujours une puissance de deux. Par conséquent, il n'y a jamais de différence inférieure à 2 entre deux valeurs doubles, résolvant ainsi tout problème d'arrondi.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!