2016-04-02 1 views
1

Dans l'une de mes affectations, je suis censé obtenir les valeurs de x^2, x^4 et la racine cubique de x dans laquelle x est de 0 à 100. Jusqu'à présent, j'ai ce. (Test avec 5 chiffres)C - Trouver la racine Cube d'un nombre

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

int powers(int n) 
{ 
    return (n < 0) || (powers(n-1) && printf("%d\t%d\t%d\t\t%d\n", n, n*n, n*n*n*n, cbrt(n))); 
} 

int main(void) 
{ 
    printf("number\tx^2\tx^4\t\tx^(1/3)\n"); 
    powers(5); 

    return 0; 
} 

MA SORTIE

number x^2 x^4  x^(1/3) 
0   0  0   0 
1   1  1   0 
2   4  16   -108170613 
3   9  81   1225932534 
4   16  256  -1522700739 
5   25  625  -1124154156 

Alors, ma place et quatric travaillent aussi simple qu'il est, mais je ne peux pas aller travailler avec la racine cubique. Quand je fais la racine cubique séparément cela fonctionne. printf("Cube root of 125 is %f\n, cbrt(125)); donne Cube root of 125 is 5.0000.

J'ai besoin d'aide pour comprendre pourquoi cela ne fonctionne pas dans ma fonction. Nouveau à la programmation C alors s'il vous plaît soyez gentil. (compilateur: Borland C++ et IDE: C-libre 5,0)

+4

'' cbrt' retourne un double', donc vous devez imprimer le résultat avec l'un des formats à virgule flottante: '% f', '% g' ou'% e'. Activez les avertissements pour en savoir plus sur ces incompatibilités de formats d'impression et de types d'arguments. –

+0

@ColonelThirtyTwo Quel en-tête dois-je utiliser? –

+0

@MOehm Ohmygod. ÇA A MARCHÉ. –

Répondre

2

Le problème est que cbrt accepte et retourne une valeur float ou double, ce qui signifie que cbrt(n) convertira automatiquement n à un float/double avant de passer à la fonction. La fonction retourne un float/double mais vous n'êtes pas stocker nulle part où repousser une conversion à un int, vous passez directement à printf spécifiant %d si la valeur est interprétée comme une int même si elle est en fait un float/double . Un simple cast suffirait: (int)cbrt(n), ou vous pouvez utiliser le spécificateur %f ou %g et l'imprimer comme son type réel.

également stocker dans une variable temporaire conduirait au même comportement de conversion:

int v = cbrt(n); 
printf("%d\n", v); 
+0

Oh d'accord, utilisera simplement 'printf ("% f \ n ", cbrt (n))' fais le tour comme '% f' prend un flottant? –

+1

@ImtiazRaqib: C'est un peu plus compliqué que ça: 'printf' est une fonction variadique, et certains arguments de telles fonctions sont" promus ". 'char' et' short' sont promus en 'int' et' float' est promu '' double''. Le résultat de ceci est que vous pouvez utiliser '% f' et'% g' pour 'float' et' double'. Activez les avertissements et laissez le compilateur vous informer des formats incorrects. –

+0

@MOehm Cela a beaucoup de sens. Dans mon compilateur, ils ne cessaient de mentionner 'promu int doubler' et je ne comprenais pas ce que cela signifiait. Je vous remercie. –