double power(double base, int exponent){
        //Just for context, a double is larger than a long long int
        //Also method programmed to assume non-decimal, non-negative input for root
        double answer = base;
        if(exponent == 0){
            return 1.0;
        }
        else if(exponent > 0){
            for(int i=1; i<exponent; i++){
                answer*=base;
            }
            return answer;
        }
        else{//if exponent is negative
            for(int i=1; i<exponent*(-1); i++){
                answer*=base;
            }
            return 1/answer;
        }
    }
    double newtonRaphsonRoot(double base, int root){//FOR FIDING ROOTS OF CONSTANT #s
        if(base == 1){
            return 1.0;
        }
        //Formula: x1 = x0 - f(x0)/f'(x0)
        //--------------------------------
        //Also method programmed to assume non-negative integer input for root
        double epsilon=0.01;//accuracy
        double answer = base;//answer starts off as initial guess and becomes better approximated each iteration
        if(base > 1){
            answer=base/2;
        }
        while( answer - ( power(answer,root) - base)/(root*power(answer,root-1) ) > epsilon){
        //Formula: x1 = x0 - f(x0)/f'(x0). Continue formula until error is less than epsilon
            answer = answer - ( power(answer,root) - base)/(root*power(answer,root-1) );
            std::cout<<"Approximation: answer = "<< answer <<"\n";
        }
        return answer;
    }

  • Istnieje algorytm matematyczny do obliczania NTH root o numerze X, znanej jako metoda Newton-Raphson do przybliżeniach korzeni. Próbowałem zaprogramować ten algorytm. Long Story Krótki wydaje się, że otrzymuję właściwą odpowiedź, ale problem 1: Utknąłem w tym czasie i nie wiem, dlaczego problem 2: Dokładność miała być określona przez zmiennego epsilonu, ale odpowiedź zawsze wychodzi 5 miejsc po przecinku. *
0
Mukasa Ricketts 27 lipiec 2020, 09:02

1 odpowiedź

Najlepsza odpowiedź

Jednym z problemów jest to, że sprawdzenie Epsilon Kod powinien być

while (fabs(error) > epsilon) {
    ... improve ...
}

Zamiast tego sprawdzasz następne przybliżenie przed epsilonem (również bez fabs).

Innym problemem jest to, że strumień wyjściowy wykorzystuje stałą liczbę dziesiętnych podczas drukowania wartości pływających punktów, jeśli chcesz zwiększyć, aby wyszukać std::setprecision (lub po prostu użyj printf("%.18g\n", x);, co osobiście wolę do zrobienia).

2
6502 27 lipiec 2020, 06:11