Le problème est l'utilisation incorrecte du format printf - utiliser% g /% f au lieu de% d
BTW - si vous vous demandez ce que votre code a fait ici est une explication abrégée qui peut vous aider à comprendre:
La routine printf a traité votre résultat à virgule flottante de sqrt comme entier.
Les entiers signés et non signés ont leurs représentations de bits sous-jacentes (en d'autres termes, c'est la façon dont ils sont 'codés' dans la mémoire, les registres, etc.). En spécifiant le format à imprimer, vous lui dites comment il doit déchiffrer ce modèle de bits dans une zone/un registre de mémoire spécifique (cela dépend des conventions d'appel, etc.). Par exemple:
unsigned int myInt = 0xFFFFFFFF;
printf("as signed=[%i] as unsigned=[%u]\n", myInt, myInt);
donne: "signée = [- 1] comme non signé = [4294967295]"
modèle un bit utilisé mais traité comme signé d'abord et non signé plus tard. La même chose s'applique à votre code. Vous avez demandé à printf de traiter le modèle de bits utilisé pour "encoder" le résultat à virgule flottante de sqrt en entier. Voir ceci:
float myFloat = 8.0;
printf("%08X\n", *((unsigned int*)&myFloat));
impressions: "41000000"
Selon single precision floating point encoding format. 8.0 est simplement (-1)^0 * (1 + fraction = 0) * 2^(exp = 130-127) = 2 * 3 = 8.0 mais imprimé en int ressemble à 41000000 (hex bien sûr).
Pouvez-vous poster votre code? – hmjd
Sans le code en question, cela ne peut pas être répondu de manière significative. –
sqrt ne renvoie jamais de valeurs négatives. Vos problèmes sont très profonds. Le fait que vous ne réalisiez pas que nous aurions besoin de voir votre code pour répondre à cette question est votre problème fondamental. J'espère que vous ne pensez pas que l'ordinateur peut faire la même chose! –