tmp w tym przypadku ma być 3 W sposobie, który ty podałeś tmp musi mieć wartość liczbową, czyli w tym przypadku 0.33(3) co wiąże się z niedokładnością. Np tmp=0.25 nie ma takiego problemu.
double tmp = 1/3; // pozwoliłem sobie połączyć 2 w 1
1/3 w C++ daje 0, bo w działąniu operujesz tylko na liczbach całkowitych. Musiałbyś zmienić to na 1.0/3.0, wtedy zmienna tmp miałaby wartość 0.333… i dla 8.0 dostaniesz wynik 2.0.
To co podał krakers09 to wynika z własności logarytmu, nie wiem czy jest bardziej dokładne, być może, a być może jest równie niedokładne.
exp(x) to e^x (e podniesione do x’ej potęgi)
log(x) to logarytm o podstawie e z liczby x (log_e(x))
Ogółem A^(log_A(x)) daje x.
Poza tym log_a(x^n) to n * log_a(x).
Składając to wszystko wynika, że to exp(log(a)/(tmp)) to po prostu a^(1/tmp)
wiem, że przypadek jest ekstremalny, i pewnie nikt nie będzie go nigdy obliczał, ale metoda zaproponowana przez krakers09 , ma jeden podstawowy błąd, ze względu na dziedzinę logarytmu, nie da się obliczyć pierwiastka liczb niedodatnich, pewnie dało by się to jakoś rozwiązać korzystając z abs(), ale w cmath nie ma chyba funkcji signum() więc jakaś jej prosta implementacja
int sgn(int num) {
if (num > 0) return(1);
else if (num < 0) return(-1);
else return(0);
}