trouver la racine du cube en C ++?
Des choses étranges se produisent lorsque j'essaie de trouver la racine cubique d'un nombre.
Le code suivant me renvoie undefined. Dans cmd : -1.#IND
cout<<pow(( double )(20.0*(-3.2) + 30.0),( double )1/3)
Tandis que celui-ci fonctionne parfaitement bien. Dans cmd : 4.93242414866094
cout<<pow(( double )(20.0*4.5 + 30.0),( double )1/3)
De manière mathématique, elle doit travailler puisque nous pouvons avoir la racine cubique d'un nombre négatif.
Pow est à partir de Visual C++ 2010 mathématiques.h la bibliothèque. Des idées?
source d'informationauteur ilcredo
Vous devez vous connecter pour publier un commentaire.
pow(x, y)
de<cmath>
ne fonctionne PAS si x est négatif et y est non intégrale.C'est une limitation de
std::pow
comme indiqué dans le C standard et sur cppreference:Il ya un couple de façons de contourner cette limitation:
Cube-l'enracinement est la même chose que de prendre quelque chose pour le 1/3 de la puissance, alors vous pourriez le faire
std::pow(x, 1/3.)
.En C++11, vous pouvez utiliser
std::bcrt
. C++11 introduit à la fois racine carrée et la racine cubique de fonctions, mais pas de générique n-ième fonction racine qui dépasse les limites destd::pow
.La puissance
1/3
est un cas spécial. En général, la non-intégrale des puissances de nombres négatifs sont complexes. Il ne serait pas pratique pour les pow à vérifier pour les cas spéciaux comme entier racines, et d'ailleurs,1/3
comme un double n'est pas exactement 1/3!Je ne sais pas à propos de visual C++ pow, mais mon homme page indique les erreurs:
Vous aurez à utiliser un plus spécialisés racine cubique de la fonction si vous voulez cube racines de nombres négatifs - ou couper les coins ronds et de prendre la valeur absolue, puis prendre la racine cubique, puis multiplier le signe de retour sur.
Note que, selon le contexte, un nombre négatif
x
à la1/3
puissance n'est pas nécessairement négatif racine cubique vous vous attendez. Il pourrait tout aussi facilement être le premier complexe de la racine,x^(1/3) * e^(pi*i/3)
. C'est la convention mathematica utilise; il est également raisonnable de la juste dire que c'est pas défini.Tandis que (-1)^3 = -1, vous ne pouvez pas simplement prendre un rationnel puissance d'un nombre négatif et s'attendre à une vraie réponse. C'est parce qu'il y a d'autres solutions à ce rationnelle de l'exposant qui sont imaginaires dans la nature.
http://www.wolframalpha.com/input/?i=x^(1/3),+x+de+-5+à+0
De même, la parcelle x^x. Pour x = -1/3, ce qui devrait avoir une solution. Toutefois, cette fonction est réputée non défini dans la R pour x < 0.
Par conséquent, ne pas attendre que les mathématiques.h pour faire de la magie qui le rendrait inefficace, il suffit de changer le signe de vous-même.
Suppose que tu dois prendre le négatif et le mettre dans la suite. Vous pouvez avoir un wrapper de le faire pour vous si vous le voulez vraiment.
Ne jette pas à
double
en utilisant(double)
utiliser une double constante numérique à la place:Devrait faire l'affaire!
Également: ne pas inclure
<math.h>
dans les projets C++, mais l'utilisation<cmath>
à la place.Vous pouvez également utiliser
pow
de la<complex>
- tête pour les raisons indiquées par buddhabrotpow( x, y )
est la même chose que (c'est à dire l'équivalent)exp( y * log( x ) )
si log(x) n'est pas valide alors pow(x,y) l'est aussi.
De même vous ne pouvez pas effectuer de 0 à la puissance de rien, même si mathématiquement il doit être 0.
C++11 a la
cbrt
fonction (voir, par exemple,http://en.cppreference.com/w/cpp/numeric/math/cbrt) de sorte que vous pouvez écrire quelque chose commeJe n'ai pas accès à la norme C++ donc je ne sais pas comment le négatif argument est géré... un test sur ideone http://ideone.com/bFlXYs semble confirmer que le C++ (gcc 4.8.1) prolonge la racine cubique avec cette règle
cbrt(x)=-cbrt(-x)
quandx<0
; pour cette extension, vous pouvez voir http://mathworld.wolfram.com/CubeRoot.htmlJe cherchais coudée de racine et trouvé ce fil et il me semble que le code suivant peut fonctionner:
Je pense que vous ne devez pas confondre l'exponentiation avec la nième racine d'un nombre. Voir le bon vieux Wikipedia
parce que le 1/3 retourne toujours 0 comme il sera considéré comme entier...
essayez avec 1.0/3.0...
c'est ce que je pense, mais d'essayer et de mettre en œuvre...
et ne pas oublier de déclarer les variables contenant 1.0 et 3.0 double...
Voici une petite fonction que j'ai frappé vers le haut.
Il utilise de Newton-Raphson pour trouver une racine cubique.
Parfois de Newton-Raphson est bloqué, si la racine est très proche de 0, alors la dérivée peut
obtenir grand et il peut osciller. J'ai donc serré et obligé de redémarrer si cela arrive.
Si vous avez besoin de plus de précision, vous pouvez changer la FLT_EPSILONs.
Si jamais vous avez pas de bibliothèque de mathématiques, vous pouvez utiliser ce moyen pour calculer la racine cubique:
racine cubique
C'est la dérive de la
sqrt
algorithme ci-dessous. L'idée est queb
etx /b /b
plus grand et les plus petits à partir de la racine cubique dex
. Ainsi, la moyenne des deux est plus proche de la racine cubique dex
.Racine carrée Et Racine Cubique (en Python)
En revanche pour la racine carrée,
last_b_1
etlast_b_2
sont nécessaires dans la racine cubique car b clignote. Vous pouvez modifier ces algorithmes pour calculer la quatrième racine, cinquième racine et ainsi de suite.Grâce à mon professeur de mathématiques M. Brenner en 11e année, qui m'a dit de cet algorithme de
sqrt
.Performance
Je l'ai testé sur un Arduino avec 16mhz fréquence, horloge:
0.3525ms
pour yourPow0.3853ms
pour nième racine2.3426ms
pour curt