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.