Calc pi с длинным двойным в C - PullRequest
       21

Calc pi с длинным двойным в C

0 голосов
/ 05 августа 2011

У меня проблема с calc of pi, когда я помещаю long double в переменную, появляется большое число, но не правильное значение, если вы измените функцию calcf на double, она работает.Мой код:

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

long double calc(int n, double denominador) {
    //printf("%lf e",(pow(-1,n))/denominador);
    //printf("%d\n",(denominador));
    long double var = (long double) ((4.0*(pow(-1.0,n)))/denominador);
    printf("%Lf\n",(long double)var);
    return var;
}

double calcf(int n, int denominador) {
    //printf("%lf e",(pow(-1,n))/denominador);
    //printf("%d\n",(denominador));
    double var = (4.0*(pow(-1.0,n)))/denominador;
    //printf("%lf",var);
    return var;
}

int main() {
    int NUMERO = 100000000;
    long double pi = 4L;
    double pif = 4;
    int i;
    int n=1;
    printf("%d e %d",sizeof(double),sizeof(long double));
    for (i=3;i<NUMERO;i+=2) {
            pi += calc(n,(double) i);
        //pif += calcf(n,i);

            n++;
    }
    printf("PI: %1.50Lf\n",pi);
}

Что я делаю не так?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 27 августа 2011

Ну, у этой программы много проблем;но хуже всего то, что вы используете серию Грегори, которая является чуть ли не самым медленным алгоритмом.Вы даже не получите двойной точности с этим, не говоря уже о длинной двойной.Вы должны были бы позволить ему пройти около 10 16 шагов только для удвоения.

Математики используют -1 n , чтобы указать переменный знак, что прекрасноконтекст, но использовать pow() для его вычисления просто глупо, тем более что это операция с плавающей запятой.Вместо этого используйте целое число, которое начинается с -1, и продолжайте делать i = -i.

. Вам нужно быть более осторожным с вашими типами и константами.4L - это длинное целое число, а не длинный двойной.Вы хотите 4.0L.Конечно, компилятор все равно его использует, но это плохая практика.Вы используете простые старые двойные константы, такие как 4.0, когда стремитесь к длинной двойной точности.

Глупо продолжать умножать все на 4.0 на каждом шаге.Вы можете просто сделать это в конце.

3 голосов
/ 05 августа 2011

pow() принимает и возвращает удваивается.Вам нужно использовать powl(), который вместо этого принимает и возвращает длинные двойные числа.В противном случае вы просто применяете удвоение к длинному удвоению и не получаете никакой точности

...