注册 登录
编程论坛 C语言论坛

估算圆周率 pi 精确度不够的问题

美美学c 发布于 2023-10-04 20:36, 981 次点击
#include <stdio.h>
#define M 1e-6
int main(void) {
int sign=1;
double  i,pi=0;
for(i=1;(double)fabs(1/i)>M;i++,i++)
{
    pi=pi+sign*(double)1/i;
    sign=-sign;
}
pi=4*pi;
printf("%10.8f",pi);
    return 0;
}
通过公式pi/4≈1-1/3+1/5-1/7.....估算pi的值,直到某一项的绝对值小于1e-6
6 回复
#2
美美学c2023-10-04 20:37
发现少了头文件

#3
rjsp2023-10-04 22:50
1/i 是多少?
1.0/i
#4
forever742023-10-05 08:14
回复 3楼 rjsp
楼主的 i 是个double啊,那个没问题的。
#5
rjsp2023-10-05 12:41
回复 4楼 forever74
你说得对。

i 是 index 的简写,来自于 数学符号,而后被 ForTran 等编译语言借用。
我没想到有人把它定义为 double 类型。

---------------------------

按照题目要求「直到某一项的绝对值小于1e-6」来看,这个小于1e-6的项应当被加进去;而且题目要求「……小于……」,所以循环条件应该是「…… >= ……」
程序代码:
#include <stdio.h>

int main( void )
{
    double pi_4 = 0;
    for( unsigned i=0; pi_4+=(1.0-i%2*2)/(1+i*2), (1+i*2)<=1000000; ++i );

    printf( "%.6f\n", 4*pi_4 );
}
运行输出 3.141595
结果看起来没问题。(因为单项精度到1e-6,所以只需要看小数点前5位)
#6
forever742023-10-05 20:54
回复 5楼 rjsp
我的第一门编程语言是Fortran,所以我也先入为主地认为i,j,k,l,m,n都应该是整数。
然而,时代说没有什么不可能。
#7
纯蓝之刃2023-10-06 13:48
回复 6楼 forever74
没用过Fortran。据说i-n在Fortran中被隐式声明成了整型变量,不用定义就可以使用,才导致了后来的语言都习惯用i,j,k等作为循环的变量,不知道是不是真的。
1