You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言简单数学程序运行结果错误,如何定位代码问题?

错误原因说明

代码存在两处问题,其中直接导致输出为-0.000000的是格式符不匹配的严重错误:

  • printf 格式符与参数类型不匹配:代码中sum被定义为long double类型,但%lf仅用于输出double类型浮点数。输出long double必须使用%Lf(注意L为大写)。C语言的可变参数函数不会自动校验参数类型与格式符的匹配关系,类型不匹配属于未定义行为,会直接导致内存数据解析错误,输出完全不可信的垃圾值。
  • 运算精度与累加器类型不匹配:代码中使用的pow是double版本的幂函数,常量1是int类型,运算过程全程以double精度计算,再提升为long double存入sum,既无法发挥long double的高精度优势,还存在不必要的精度损失。如果要匹配long double的精度,应该使用long double类型的常量1.0L,以及对应long double版本的幂函数powl。
修正后可正确运行的代码
#include <stdio.h>
#include <math.h>

int main(int argc, char const *argv[]) {
  // 迭代次数k
  int k = 100;
  long double sum = 0;
  for (int n = 0; n < k; n++)
    sum += 1.0L / powl(2, n);
  printf("series sum = %Lf", sum);

  return 0;
}

运行上述代码,输出结果约为2.000000,符合等比数列求和的预期(无穷级数和为2,迭代100次的结果已经和理论值几乎没有可感知的误差)。

如果不需要用到long double的高精度,也可以直接把sum定义为double类型,保留原有运算逻辑,将格式符保持为%lf即可得到正确结果。

内容的提问来源于stack exchange,提问作者mayank mahajan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 02:36:10