C语言嵌套for循环输出无穷大 代码问题排查求助
问题原因分析
- 变量未重置:全局变量
f、calculation没有在每次外层循环开始前重置初始值。第一次内层循环跑完后f已经是19!的结果,下一轮循环会直接在这个基础上继续乘1~19,数值快速爆炸。 - 整数类型溢出:32位有符号int的最大取值仅为2147483647,13!就已经超过这个上限,第一次内层循环运行到i=13时就已经触发整数溢出,属于C语言未定义行为,
f的值会完全异常。 - 浮点精度不足:
float类型的精度和取值范围有限,数值溢出后就会被表示为无穷大。
修复方案
如果需要保持原有逻辑(外层跑10001次,每次内层计算1/1!到1/19!的和),可以做如下修改:
- 将
f、calculation的定义放到外层循环内部,每次循环重置初始值 - 把
f的类型改为64位长整型long long,可容纳19!的计算结果 - 把
calculation改为精度更高的double类型
修复后代码如下:
#include <stdio.h> int main() { for(int j=0; j<=10000; j++) { long long f = 1; double calculation = 0; int i; for(i=1; i<=19; i++) { f = f * i; calculation += 1.0 / f; } printf("第%d次计算:1/%d!=%lf,累加和为%lf\n", j+1, i-1, 1.0/f, calculation); } return 0; }
扩展优化(适配内层循环跑10000次的需求)
如果实际需求是内层循环计算1/1!到1/10000!的和,用整数存阶乘会很快溢出,可改用递推法直接计算每一项,无需存储完整阶乘,不会触发溢出:
#include <stdio.h> int main() { for(int j=0; j<=10000; j++) { double calculation = 0; double term = 1.0; int i; for(i=1; i<=10000; i++) { term /= i; calculation += term; } printf("第%d次计算:1/10000!累加和为%.15lf\n", j+1, calculation); } return 0; }
内容的提问来源于stack exchange,提问作者NewCoder
相关产品推荐
相关产品推荐

