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 peuvent-elles être parfaitement représentées sous forme de doubles ?

Susan Sarandon
Libérer: 2024-10-29 13:36:02
original
885 Les gens l'ont consulté

Can All Integer Values be Perfectly Represented as 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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal