Il existe un moyen réel de créer l'infini et l'infini négatif. Selon la norme IEEE 754, que C89 suit, l'infini est défini comme un nombre à virgule flottante contenant tous les zéros dans la mantisse (vingt-trois premiers bits) et tous les uns dans l'exposant (huit bits suivants). nan
est défini comme tout nombre ayant tous les uns dans l'exposant, et tout sauf tous les zéros dans la mantisse (car c'est l'infini). La partie la plus difficile est de générer ce nombre, mais cela peut être accompli avec le code suivant :
unsigned int p = 0x7F800000; // 0xFF << 23
unsigned int n = 0xFF800000; // 0xFF8 << 20
unsigned int pnan = 0x7F800001; // or anything above this up to 0x7FFFFFFF
unsigned int nnan = 0xFF800001; // or anything above this up to 0xFFFFFFFF
float positiveInfinity = *(float *)&p;
float negativeInfinity = *(float *)&n;
float positiveNaN = *(float *)&pnan;
float negativeNaN = *(float *)&nnan;
Cependant, le simple fait de lancer un unsigned
à un float
aurait pour conséquence la création par le compilateur d'un float
de la même valeur. Donc, ce que nous devons faire est de forcer le compilateur à lire la mémoire comme un float, ce qui nous donne le résultat souhaité.
1 votes
Les plateformes arbitraires ne sont même pas tenues par la norme de supporter les NaN et les infinis. Je crois qu'une implémentation conforme à la norme IEEE 754 est requise pour les obtenir par division, comme dans votre exemple, cependant.