尝试计算圆周率

4

要计算圆周率,可以使用方程式pi/4=1-(1/3)+(1/5)-(1/7)+... 将其乘以4,即可得到圆周率的值。 我创建了一个公式来计算每个步骤相对于它的位置1/(2n-1)的方程,并编写了代码。

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

int main(int argc, char** argv) 
{
    double p = 0;
    double pi = 0;
    int j = 1;

    do 
    {
        if (j % 2 == 1)
        {
            p = p + (1 / (2 * j - 1));
        }
        else
        {
            p = p - (1 / (2 * j - 1));
        }
        pi = p * 4;

        printf("%lf\n", pi);

        j++;
    } while (j < 10);

    return (EXIT_SUCCESS);
}

但它只输出了4.0000。为什么?我找不到我的错误。


3
p = p + (1 / (2 * j - 1)); 更改为 p = p + (1.0 / (2 * j - 1)); - Amadeusz
4
(1 / (2 * j - 1)) 是整数除法。 - user2371524
2
pi/4=1-(1/3)+(1/5)-(1/7)+... 这个公式收敛极其缓慢。这是计算pi最糟糕的方法。 - llllllllll
1
@liliscent 我的目标是进行缓慢的转换。之后我会绘制它。 - DerEntinator
我看到的第一个问题是所有的文字都是整数而不是双精度浮点数。例如,使用1.0代替1,使用2.0代替2等等。目前,所有的计算都是使用整数进行的。当使用整数进行计算时,小数部分会被舍去。 - user3629249
2个回答

4
在语句p = p + (1 / (2 * j - 1));中,表达式(1 / (2 * j - 1)的结果为整数。要获得期望的结果,请将其中一个操作数转换为浮点类型,即使用1.0(float)(2 * j - 1)

请替换该语句。

p = p + (1 / (2 * j - 1));/* 1/(2*j-1) results in integer, you won't get expected result */

使用

p = p + (1. / (2 * j - 1));/* 1. means making floating type */

4
在您的表达中
1 / (2 * j - 1)

/的两个操作数都是int类型,因此它执行整数除法,会截断小数部分。如果您想执行实数除法,请确保至少有一个操作数具有浮点类型。您可以通过编写以下代码轻松实现:

1.0 / (2 * j - 1)

在C语言中,包含小数点的数字常量(没有后缀)是double类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接