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
相关产品推荐
相关产品推荐

