[BC++] Dritte Wurzel aus einer negativen Zahl (pow domain error) ziehen

Sicherlich ist es schon vielen so ergangen: Excel rechnet es, der Taschenrechner auch, bloß im C++-Code ist der Wurm drin. Beim Ziehen der dritten Wurzel aus einer negativen Zahl mittels pow-Funktion (x^1/3) poppt ein pow domain error auf:

#include <math.h>

double x = -27.0;
double y = pow(x, (1.0 / 3.0)); // <-- pow domain error

Die Lösung ist rel. einfach. Für ungerade Wurzel-Exponenten kann man die Wurzel aus dem Absolutwert der Basis ziehen und das Ergebnis dann mit dem Vorzeichenwert nochmal multiplizieren:

#include <math.h>

double x = -27.0;
double ax = fabs(x);
double y = pow(ax, (1.0 / 3.0)) * x / ax;

Das Problem besteht in der Umsetzung der pow-Funktion über Logarithmen:

pow(x,y) = (e^ln(x))^y = e^(y*ln(x))

d.h.

pow(-1,y) = e^(y*ln(-1)) --> der nat. Logarithmus akzeptiert keine neg. Argumente oder 0 --> pow domain error

Kommentare sind geschlossen.