0

我在计算 pi 时遇到问题,当我将 long double 放入变量时出现一个大数字,但不是正确的值,如果你用 double 更改 calcf 函数,它就可以工作。我的代码:

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

我做错了什么?

谢谢你。

4

2 回答 2

3

pow()接受并返回双打。您需要改用powl()which 接受并返回 long 双打。否则,您只是将 double 转换为 long double 并且没有获得任何精度。

于 2011-08-05T04:15:40.870 回答
3

好吧,这个程序有很多问题;但最糟糕的是,您使用的是 Gregory 的系列,这几乎是目前最慢的算法。你甚至不会得到双精度,更不用说长双精度了。您必须让它运行大约 10 16步才能获得双倍。

数学家使用 -1 n来表示交替符号,这在这种情况下很好,但pow()用来计算它只是愚蠢的,特别是因为它是一个浮点运算。相反,请使用从 -1 开始的整数并继续执行i = -i.

您需要更加小心您的类型和常量。4L是一个长整数,而不是长双精度数。你想要4.0L。当然编译器无论如何都会强制转换它,但这是不好的做法。当您的目标是长双精度时,您使用的是普通的旧双精度常量,如 4.0。

在每一步都将所有内容乘以 4.0 也是愚蠢的。你可以在最后做到这一点。

于 2011-08-26T22:51:52.607 回答