2009-10-16 10 views
4

Voici ce que je veux dire essayer de fairestd :: pow donne une mauvaise approximation pour les exposants fractionnaires

double x=1.1402 
double pow=1/3; 
std::pow(x,pow) -1; 
résultat

est égal à 0, mais je pense 0,4465

l'équation est (1 + x) ^3= 1.1402, trouver x.

+2

Astuce de débogage: il est évident que rien ne cloche avec pow() si vous inspectez simplement les arguments passés à pow(). Vous verriez que la valeur du deuxième argument était zéro au lieu de 1/3, montrant que pow() fonctionne correctement et que le problème réside dans votre code. –

+1

Ok, je l'ai déjà résolu .. stupides ints – vehomzzz

+5

Tout le monde a fait cette erreur. – mob

Répondre

8

1/3 est fait comme l'arithmétique entière, donc vous attribuer 0 à 'pow. Essayez pow(x, 1.0/3.0);

18

1/3 est égal à 0. Division entière.

Essayez:

double pow = 1.0/3.0; 

Pour:

#include <iostream> 
#include <cmath> 

int main(void) 
{ 
double x = 1.1402; 
double pow = 1.0/3.0; 
std::cout << std::pow(x, pow) - 1; 

} 
+2

Ummm, ok ... \ * shrug \ * – GManNickG

+0

Parfois, la réponse la plus simple gagne, parfois la plus complète. StackOverflow randomise aussi l'ordre des réponses, donc parfois tout ce qui arrive en tête gagne. Chance du tirage. –

+0

C'était plus qu'il avait déjà accepté ma réponse, et plus tard l'a changé pour celui-là. Je n'ai pas de rancune, 13 votes suffisent, mais à l'époque j'étais maxed et l'acception était ma seule méthode d'obtenir rep. Pas de problème cependant :) – GManNickG

0

votre 1/3 est division entière, le résultat de la division entière est 0.

4

Beaucoup ont déclaré que 1/3 = 0, mais n'a pas expliqué pourquoi il en est ainsi.

C et C++ effectueront l'opération en fonction des types d'opérandes. Puisque les deux opérandes sont des entiers, il effectue une division entière créant un résultat entier. Quand il est forcé d'affecter ce résultat entier à une variable double, il convertit l'entier 0 en un double 0.0.

Il n'est pas nécessaire de doubler les opérandes. Si l'un est double, le compilateur convertira l'autre en double avant d'effectuer l'opération. 1.0/3 ou 1/3.0 retournera le résultat attendu, tout comme 1.0/3.0.