Вычисление $ \ sqrt [3] {x} $ вавилонским методом - PullRequest
1 голос
/ 26 мая 2020

Рассмотрим мою попытку реализовать вавилонский метод в C:

int sqrt3(int x) {
    double abs_err = 1.0;
    double xold = x;
    double xnew = 0;

    while(abs_err > 1e-8) {
        xnew =  (2 * xold + x/(xold* xold))/3;
        abs_err= xnew-xold;
        if (abs_err < 0) abs_err = -abs_err;
        xold=xnew;
    }
    return xnew;
} 
int main() {
    int a;

    scanf("%d", &a);
    printf(" Result is: %f",sqrt3(a));
    return 0;   
}

Результат для x = 27: 0.0000? В чем моя ошибка?

Ответы [ 2 ]

0 голосов
/ 26 мая 2020

После объяснения из учебного курса , в котором говорится, что основная c идея состоит в том, чтобы реализовать метод Ньютона-Рафсона для решения нелинейных уравнений, ИМХО, приведенный ниже код отображает этот факт более четко. Поскольку принятый ответ уже есть, я добавляю этот ответ только для справки в будущем.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

double rootCube( double a)
{
    double x = a;
    double y = 1.0;
    const double precision = 0.0000001;
    while(fabs(x-y) > precision)
    {
        x = (x + y) / 2.0;
        y = a / x / x;
    }
    return x;
}

int main(int argc, const char* argv[])
{
    if(argc > 1)
    {
        double a = 
            strtod(argv[1],NULL); 
        printf("cubeRoot(%f) = %f\n", a, rootCube(a));
    }

    return 0;
}

Здесь, в отличие от исходного кода вопроса, более очевидно, что x и y - оценки, которые уточняются, пока не будет найдено достаточно точное решение.

При изменении строки в блоке while, где обновляется y, этот код также можно использовать для решения аналогичных уравнений. Например, для нахождения квадрата root эта строка будет выглядеть так: y = a / x.

0 голосов
/ 26 мая 2020

Хотя функция возвращает int, это значение печатается с описателем неправильного формата , %f вместо %d.

Измените подпись (и имя , если можно) на что-то вроде this

double cube_root(double x) { ... }

Или измените спецификатор формата, если вам действительно нужен int.

...