随笔 - 14  文章 - 0  评论 - 0  阅读 - 276

c语言 求近似值

C语言笔记2:如何使用循环结构求π的近似值(解决数据类型不匹配的问题) - 代码先锋网 (codeleading.com)

 

1.求π的近似值

代码一:#include<stdio.h>
#include <math.h>

int main(){
int s = 1;
double pi = 0.0, n = 1.0, term = 1.0;
double eps;

// 读取用户输入的精度值
scanf("%lf", &eps);
while (fabs(term) >= eps){
pi += term;
n += 2;
s = -s;
term = (double)s / n;
}
pi = pi * 4;
printf("π的近似值是%f\n", pi);
return 0;
}

 

代码二:

#include<stdio.h>

int main(void){
double i=1;
double eps,sum=0,re=1;
scanf("%le", &eps);
while(re>=eps){
sum = sum + re;
re = re * i/(2*i+1);
i = i + 1;
}
sum = sum + re;
printf("PI = %.5f",2*sum);
return 0;
}

 

分析:

 

1. **scanf格式字符串错误**:
原先代码中使用的是 `%le`,这是不正确的。对于 `double` 类型的变量,应该使用 `%lf`。

2. **变量初始化**:
原先代码中 `i` 被初始化为 `1`,这是正确的,因为它代表了莱布尼茨公式中的分母(2n-1),而 `re` 被初始化为 `1`,代表莱布尼茨公式中的第一项。

3. **循环条件**:
原先代码中的循环条件是 `while(re >= eps)`,这意味着只要当前项 `re` 大于或等于 `eps`,循环就会继续。这是一个合理的条件,但是它可能会导致精度不够,因为 `re` 应该与 `eps` 进行绝对值比较。

4. **项的计算**:
原先代码中 `re` 的计算方式是 `re = re * i / (2 * i + 1)`,这是不正确的。莱布尼茨公式中的项应该是 `re = (-1)^(i+1) / (2*i - 1)`,其中 `i` 从 `1` 开始。

5. **输出**:
原先代码中的输出是 `printf("PI = %.5f", 2 * sum);`,这是正确的,因为莱布尼茨公式计算的是π/4,所以需要乘以2得到π。

下面是修改后的代码,并添加了注释:

```c
#include <stdio.h>
#include <math.h> // 引入math.h库以使用fabs函数

int main(void) {
double i = 1; // 初始化i为1,代表莱布尼茨公式中的2n-1
double eps, sum = 0, re = 1; // 初始化sum为0,re为1,代表莱布尼茨公式中的第一项
scanf("%lf", &eps); // 正确使用%lf读取double类型的eps

while (fabs(re) >= eps) { // 使用fabs函数进行绝对值比较
sum = sum + re; // 累加当前项
re = re * i / (2 * i + 1); // 计算下一项,这里需要修正
i = i + 1; // 更新i的值
}
sum = sum + re; // 循环结束后,加上最后一项
printf("PI = %.5f", 2 * sum); // 输出2倍的sum作为π的近似值

return 0;
}
```

修正后的 `re` 计算方式应该是:

```c
re = (i % 2 == 0 ? 1 : -1) / (2 * i - 1); // 使用三元运算符计算莱布尼茨公式中的正负号
```

或者,更清晰地:

```c
int sign = (i % 2 == 0 ? 1 : -1); // 计算符号,偶数项为正,奇数项为负
re = (double)sign / (2 * i - 1); // 计算当前项
```

这样,代码就能正确地按照莱布尼茨公式计算π的近似值了。

posted on   qh2028  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示