Quelle valeur float permet à sprintf_s () de produire «1. # QO»?

J’ai du code (c intégré hérité) qui produit un fichier .csv au moyen d’appels sprintf . Parfois, je vois des valeurs de 1.#QO . J’ai essayé de reproduire ces valeurs avec des conditions qui devraient donner l’infini négatif, l’infini positif et NaN mais aucune d’elles ne semble me donner le résultat magique 1.#QO . Alors, qu’est-ce qui produit cette valeur?

… et oui, je sais que quelque chose ne va pas dans le calcul qui produit cette valeur, mais comprendre ce que cela signifie aiderait les efforts de débogage.

[Edit 1] La ligne qui effectue la conversion est la suivante:

 sprintf_s(txt, CSV_HEADER_SIZE, "%.3f", value); 

où:

 #define CSV_HEADER_SIZE (100) char txt[CSV_HEADER_SIZE]; 

Je comstack avec MS Visual Studio 2008.

[Edit 2] Un peu plus de fouille montre que 0xFFFFFFFF donne -1.#QO :

 unsigned int i = 0xFFFFFFFF; float* f = (float*)&i; printf("%.3f", *f); // gives -1.#QO 

..et en regardant cela dans le débogueur de Visual Studio, il se développe à -1.#QNAN00 , il semble donc que ceci est probablement une représentation spécifique de Microsoft de NaN ?

“-1. # QO” est “-1. # QNAN” après “arrondi” pendant 3 positions après la virgule. Le N arrondit à un O en tant que ‘A’> = ‘5’ et ‘N’ + 1 == ‘O’.

C’est pour cette raison que votre débogueur affiche “-1. # QNAN00”, car il imprime à 7 emplacements et ajoute des zéros de remplissage à la fin.

QNaN est calme NaN .

Après beaucoup de manipulations, je peux affirmer sans 0x7FFFFFFF que définir un nombre à 0x7FFFFFFF flottant de 4 octets sur 0x7FFFFFFF et le transmettre à sprintf_s avec un spécificateur de format de %.3f est ce qui m’a donné la valeur 1.#QO :

 const int bufSize = 100; char buf[bufSize]; unsigned int i; float* f = (float*)&i; int retval; i = 0xFFFFFFFF; retval = sprintf_s(buf, bufSize, "%.3f\n", *f); printf("sprintf_s returned %d, converted val = %s", retval, buf); // == sprintf_s returned 7, converted val = -1.#QO retval = sprintf_s(buf, bufSize, "%f\n", *f); printf("sprintf_s returned %d, converted val = %s", retval, buf); // == sprintf_s returned 10, converted val = -1.#QNAN0 i = 0x7FFFFFFF; retval = sprintf_s(buf, bufSize, "%.3f\n", *f); printf("sprintf_s returned %d, converted val = %s", retval, buf); // == sprintf_s returned 6, converted val = 1.#QO retval = sprintf_s(buf, bufSize, "%f\n", *f); printf("sprintf_s returned %d, converted val = %s", retval, buf); // == sprintf_s returned 9, converted val = 1.#QNAN0 

… il semble que le %.3f format %.3f le résultat NAN. Ce qui aurait dû être 1.#QNAN0 était réduit à 1.#QO .

Un peu de googler indique une erreur de division par 0. Bien que je m’attende à quelque chose de différent si tel était le cas. Cela dit, cela semble être spécifique à MS / Visual C.

Avez-vous vérifié si sprintf_s () a renvoyé un échec? Si c’est le cas, vous ne devriez pas utiliser le résultat. Puisque le code ne ressemble pas à celui que vous avez coché, je pense que vous devriez faire cette vérification. En fait, si vous ne testez pas le résultat de l’une des fonctions *_s() , vous risquez des ennuis.