2009-11-29 6 views
4

J'ai un double qui est:Comment augmenter une double valeur par la puissance de 12?

double mydouble = 10; 

et je veux 10^12, donc 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10. J'ai essayé

double newDouble = pow(10, 12); 

et il me retourne dans NSLog: pow=-1.991886

fait pas beaucoup de sens ... Je pense que prisonnier de guerre n'est pas mon ami non?

+0

Cela n'a rien à voir avec Cocoa ou Objective-C en particulier. C++ redéfini. –

+0

En fait, Objective C est plus proche de C que de C++ (et en fait la balise C++ interfère directement avec le problème). Retagé. – avakar

+0

Veuillez écrire le code qui génère ce résultat (y compris l'instruction NSLog). –

Répondre

12

essayez pow (10,0, 12,0). Mieux encore, #include math.h.

Pour clarifier: Si vous n'incluez pas math.h, le compilateur suppose que pow() renvoie un entier. Y compris math.h apporte un prototype comme

double pow(double, double); 

Ainsi, le compilateur peut comprendre comment traiter les arguments et la valeur de retour.

+0

Quelle serait la raison derrière cela? Y at-il un autre «pow» défini avec Obj-C qui fait quelque chose de complètement différent? Cela me semblerait incroyablement stupide, en fait. – Joey

+4

La raison est que sans inclure , pow() n'a pas été déclaré du tout. C'est légal en C (pas en C++), et le compilateur suppose que pow() accepte les arguments int et renvoie un int, et génère son code en conséquence. La plupart des utilisateurs activent les options du compilateur appropriées pour avertir ou pour signaler des erreurs sur des fonctions non déclarées. – Rudedog

0

C'est la bonne syntaxe pour pow, quelle chaîne de format passez-vous à NSLog (...)?

0

Avez-vous essayé de coulée à une double:

NSLog(@"(double)pow(10, 12)     = %lf", (double)pow(10, 12)); 
+0

'pow' renvoie déjà un double, de sorte que cast sera probablement simplement ignoré par le compilateur. – Joey

+1

Cette distribution ne fait pas ce que vous attendez. Besoin d'inclure math.h. –

5

I le programme pour compiler sans ne pouvais même pas:

#include <math.h> 

Lorsque vous utilisez des fonctions mathématiques comme cela, vous devez toujours inclure les mathématiques. h et assurez-vous que vous appelez la bonne fonction de pow. Qui sait ce que l'autre fonction de pow pourrait être ... cela pourrait représenter des "power wheels" haha ​​

+1

En fait, plutôt que , comme il pose des questions sur C++. – ChrisInEdmonton

+0

doit également lier en utilisant -lm – sud03r

+2

@Chris: il pose des questions sur Objective-C, pas C++. @Neeraj: '-lm' est implicite avec les outils du compilateur Apple. –

4

Voici comment calculer x^12 avec le plus petit nombre de multiplications.

y = x*x*x; y *= y; y *= y; 

La méthode provient de Seminumerical Algorithms de Knuth, section 4.6.3.

+2

Notez que bien que ce soit généralement plus rapide que 'pow (x, 12.0) ', il sera également moins précis sur les plateformes disposant d'une bibliothèque mathématique de haute qualité. Cela peut ou ne peut pas importer, en fonction de la façon dont le résultat doit être utilisé. –

+0

Je doute que ce serait moins précis. – Nosredna

+0

Pour la valeur spécifique de 10,0, la méthode de multiplication répétée sera au moins aussi précise. Cependant, une implémentation de bibliothèque * good * de 'pow (x, 12.0)' produira un résultat avec moins de 1 ulp d'erreur pour toutes les valeurs de double précision de 'x', alors que la multiplication répétée peut avoir une erreur plus grande (2 ou 3 ulps serait raisonnablement commun). –

Questions connexes