2012-01-28 8 views
3

J'ai couru ce programme simple, mais quand je convertis de int à double, le résultat est zéro. Le sqrt des zéros affiche alors des valeurs négatives. Ceci est un exemple d'un tutoriel en ligne, donc je ne sais pas pourquoi cela se passe. J'ai essayé sous Windows et Unix.Convertir int pour doubler

/* Hello World program */ 

#include<stdio.h> 
#include<math.h> 

main() 

{ int i; 

    printf("\t Number \t\t Square Root of Number\n\n"); 

    for (i=0; i<=360; ++i) 
     printf("\t %d \t\t\t %d \n",i, sqrt((double) i)); 


} 
+8

Pouvez-vous poster votre code? – hmjd

+3

Sans le code en question, cela ne peut pas être répondu de manière significative. –

+0

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! –

Répondre

6

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).

+0

Merci. Étrange que cela passerait inaperçu sur un tutoriel. J'ai utilisé% f et ça marche bien maintenant. – user994165

+0

Le tutoriel n'aurait pas utilisé% d pour une valeur à virgule flottante –

+0

@David: N'avez-vous jamais vraiment vu un tutoriel, un livre etc sans une seule faute de frappe? Cela arrive - vraiment. – Artur

8

Peut-être que cela?

int number; 
double dblNumber = (double)number; 
+0

C'est, en effet, comment on convertit un nombre en un double, mais ce n'est pas le problème du demandeur. – Borealid

+8

Bizarrement, le titre de sa question était. Tant pis. –

2

sqrt() retour une valeur de type double. Vous ne pouvez pas imprimer une telle valeur avec le spécificateur de conversion "%d".

Essayez une de ces deux alternatives

 printf("\t %d \t\t\t %f \n",i, sqrt(i)); /* use "%f" */ 
     printf("\t %d \t\t\t %d \n",i, (int)sqrt(i)); /* cast to int */ 

L'argument i-sqrt() est converti en doubler implicitement, tant qu'il est un prototype d'envergure. Puisque vous avez inclus l'en-tête approprié, il n'y a pas besoin d'une conversion explicite.