免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7070 | 回复: 12
打印 上一主题 下一主题

[C] 求e的值,gcc运行结果为inf? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-09-03 10:02 |只看该作者 |倒序浏览
用公式e = 1 + 1/1! + 1/2! + 1/3! + 1/4! + ...

编写的程序如下:
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.     long fact(int n);
  5.     int n;
  6.     double i,sum;
  7.     printf("enter n:");
  8.     scanf("%d",&n);
  9.     for (i = 0.0,sum = 0.0; i <= n; i++)
  10.     {
  11.         sum = sum + 1.0/fact(i);
  12.     }
  13.     printf("%lf\n",sum);
  14. }

  15. long fact(int n)
  16. {
  17.     long fac;
  18.     if (n == 0 || n == 1)
  19.         fac = 1;
  20.     else
  21.         fac = fact(n - 1) * n;
  22.     return fac;
  23. }
复制代码
当n = 5时,运算结果为:2.716667

当n = 50时,就显示为:inf

不知道具体什么原因,愿指教。

先谢谢了~

论坛徽章:
0
2 [报告]
发表于 2011-09-03 10:19 |只看该作者
明显的一个错误是溢出
long fact(int n)

fact(50)

溢出是未定义行为
产生任何结果都不奇怪

论坛徽章:
0
3 [报告]
发表于 2011-09-03 10:21 |只看该作者
与结果无关
for (i = 0.0,sum = 0.0; i <= n; i++)
这个循环写得也不符合规范:
用double类型变量做循环变量
循环变量应该是整数类型

论坛徽章:
0
4 [报告]
发表于 2011-09-03 10:23 |只看该作者
不规范的地方还有
类型不一致

fact(i);     //double i,sum;

long fact(int n)

论坛徽章:
0
5 [报告]
发表于 2011-09-03 11:23 |只看该作者
还有n的类型也不应该是有符号整形,不然如果用户输入负数,lz你的程序就悲剧了。。。。

论坛徽章:
0
6 [报告]
发表于 2011-09-03 11:35 |只看该作者
而且每次计算i的阶乘都得从1到i递归一次效率多低啊,要是每次计算i的阶乘以后能保存下来当计算(i+1)的时候再直接采用不更好啊

论坛徽章:
0
7 [报告]
发表于 2011-09-03 12:56 |只看该作者
回复 2# KBTiller


是这个求阶乘的函数定义有错吗?

论坛徽章:
0
8 [报告]
发表于 2011-09-03 12:56 |只看该作者
回复 3# KBTiller


    刚开始学C语言,是有不少不规范的。谢谢指出。

论坛徽章:
0
9 [报告]
发表于 2011-09-03 12:57 |只看该作者
回复 6# x5miao


    好的想法。谢谢。

论坛徽章:
0
10 [报告]
发表于 2011-09-03 13:32 |只看该作者
回复 7# GeBron


    两说。在一定范围内是正确的,一旦结果超过了long的表示范围,就是错的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP