0

i have a problem in calc of pi, when i put long double in variable appears a big number, but not the correct value, if you change for calcf function with double it works. My code:

#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);
}

What i'm doing wrong?

Thank you.

4

2 に答える 2

3

このプログラムには多くの問題があります。しかし、最悪の問題は、グレゴリー級数を使用していることです。これは、世の中で最も遅いアルゴリズムです。ロングダブルは言うまでもなく、それで倍精度を取得することすらできません。ダブルの場合は、約10〜16ステップを実行する必要があります。

数学者は、-1 nを使用して交代符号を示します。これは、そのコンテキストでは問題pow()ありませんが、特に浮動小数点演算であるため、それを計算するために使用するのはばかげています。代わりに、-1で始まる整数を使用し、続けてi = -iください。

タイプと定数にはもっと注意する必要があります。4Lはlong整数であり、longdoubleではありません。あなたが欲しい4.0L。もちろん、コンパイラはとにかくそれをキャストしますが、それは悪い習慣です。長い倍精度を目指す場合は、4.0のような単純な古い倍精度を使用しています。

また、すべてのステップですべてに4.0を掛け続けるのもばかげています。あなたは最後にそれをすることができます。

于 2011-08-26T22:51:52.607 に答える
3

pow()double を受け取って返します。powl()代わりに、long double を受け取って返す whichを使用する必要があります。そうしないと、double を long double にキャストするだけで、精度が向上しません。

于 2011-08-05T04:15:40.870 に答える