6
votes

STD :: POW donne une mauvaise approximation pour les exposants fractionnaires

Voici ce que je veux dire essayer de faire xxx

résultat est égal à 0,4465

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


4 commentaires

Conseil de débogage: il serait évident que rien ne va mal avec POW () si vous inspectez simplement les arguments transmis à POW (). Vous verriez que la valeur du deuxième argument était égale à zéro au lieu de 1/3, montrant que POW () fonctionne correctement et le problème réside dans votre code.


Ok je l'ai déjà résolu .. stupide intens


Tout le monde a fait cette erreur.


Dupliqué possible de Division 1 / N retourne toujours 0.0


4 Réponses :


21
votes

1/3 est 0. C'est une division entière.

Essayez: p> xxx pré>

pour: p>

#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 commentaires

Parfois, la réponse la plus simple gagne, parfois la plus complète. Stackoverflow a également randomis l'ordre des réponses, donc parfois tout ce qui se présente sur des victoires de dessus. Chance du tirage au sort.


C'était plus qu'il avait déjà accepté ma réponse, puis l'a changé à cette question. Je ne tiens aucune rancune, 13 votes suffisent bien, bien que à l'époque, j'ai été maxe et que l'Acception était ma seule méthode d'obtention de représentants. Pas de problèmes cependant :)



12
votes

1/3 est fait en tant qu'arger arithmétique, vous attribuez donc 0 à pow . Essayez pow (x, 1.0 / 3.0);


0 commentaires

1
votes

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


0 commentaires

9
votes

Beaucoup ont déclaré que 1/3 = 0, mais n'ont pas expliqué pourquoi c'est le cas.

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

Il n'est pas nécessaire de rendre les deux opérandes doubles, si l'une ou l'autre est la double du compilateur convertira l'autre en double avant-même avant d'effectuer l'opération. 1.0 / 3 ou 1 / 3.0 renvoie tous les deux le résultat que vous attendez, de même que 1,0 / 3.0.


0 commentaires