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); // 计算当前项
```
这样,代码就能正确地按照莱布尼茨公式计算π的近似值了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!