刚学c++自己编的计算圆周率的疑惑

img


为什么每次输出的值都是2?
怎么才能正确让他输出的值,我思考了半天也没想出来办法。
下面为借鉴的圆周率无穷数级公式

img


#include <iostream>
#include <math.h>

using namespace std;

int main()
{
    double b, c = 0;
    int  n = 1;

    while (n < 10000)
    {
        b = 1.0 /(n * n);
        c = c + b;
        n ++;

    }
    b = sqrt(c * 6);

    cout<<"d的值:"<< b <<endl;
    printf("%lf\n",b);//6位
    printf("%.10lf\n", b);//10位
    printf("%.15lf\n", b);//15位

    return 0;
}


img

把 int都换成float或者double试试


#include<bits/stdc++.h>
using namespace std;
int main(){
    int a = 1;
    //用浮点数计算
    float b,d,c=0;
    while(a<10000){
        a++;
        //a*a
        b = 1.0/ (a*a);
        c = c + b;
    }
    //放循环外
    d = sqrt((c+1) * 6);
    cout<<"d 的值:"<<d<<endl;
return 0;
}

这个问题的主要原因是C/C++中的除法符号/,如果它的两侧都是int整数类型,那么除法结果也是整数,相当于直接去小数点。

第17行:b = 1 / ((a + 1) * (a + 1))

不管右边的a是多少,b永远是0。因为被除数小于除数,数学运算结果下为0.几,但是在C/C++中直接去除了小数点,所以结果除出来结果是0。

这个问题可以通过显式类型转换来解决,只要除号两侧有一个不是整型就可以:

  1. double x = 1.0 / a (1.0这样的常量在C/C++中默认为double类型)
  2. double x = (double)a / b
  3. double x = double(a) / b

一直输出2是因为c一直在加b,而b一直是0,所以c一直是2。变量bcd在你的代码中都应该定义为double或者float类型,这样才能记录小数点。