为什么巴塞尔问题总是显示相同的数字?

时间:2018-11-27 18:19:18

标签: c

您能告诉我为什么这没有用吗? 我必须显示来自Basel问题的Pi编号,但是我不知道为什么该程序始终显示相同的编号,尽管我选择了不同的“编号”。 非常感谢!

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define Pi 3.14159
int main()
{
    int number;
    printf("max number: ");
    scanf("%d",&number);
    float euler;
    float sum=0;
    for(int i=1; i<number;i++)
    {
        sum=sum + (1/(i*i));
    }
    euler=sqrt(6*sum);
    printf("Euler: %lf \n",euler);
    printf("Pi from math library = %f",Pi);
    return 0;
}

2 个答案:

答案 0 :(得分:3)

问题是表达式(1/(i*i))是使用整数数学计算的。换句话说,结果始终是整数,并且对于i的任何大于1的值,结果始终为0。

最简单的解决方法是将该表达式重写为(1.0f/(i*i))。这将对i进行平方,将结果转换为float,然后进行除法。

答案 1 :(得分:0)

发布的代码将integerdouble文字混合在一起,并期望结果为float

以下建议的代码:

  1. 干净地编译
  2. 执行已实现的功能

现在是建议的代码

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
// define a float value rather than a double value
#define Pi 3.14159f

int main( void )
{
    int number;
    printf("max number: ");
    scanf("%d",&number);

    float euler;
    float sum=0;

    for(int i=1; i<number;i++)
    {
        // perform float math rather than integer math
        sum=sum + (1.0f/(float)(i*i));
    }

    euler=sqrtf(6*sum);  // < note float version rather than double version
    printf("Euler: %lf \n",euler);
    printf("Pi from math library = %f",Pi);
    return 0;
}