如何用C程序从右向左计算交错级数之和并修复结果为0的问题
交错级数从右向左求和结果异常修复
你需要计算的是前10000项交错调和级数的和:
1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + ... + 1/9999 - 1/10000
该和的理论值约为ln2≈0.693。
原右向左求和代码的错误点
- 循环条件完全写反:原代码循环判断条件为
i<1,初始i值为10000,判断直接不成立,循环体一次都不会执行,result始终为初始值0.0,最终输出必然是0.000000,正确的循环终止条件应为i >= 1。 - 符号逻辑冗余易错:原代码用flag变量来回翻转符号,初始值设置如果和遍历顺序不匹配就会出现符号全错的问题,直接根据项数i的奇偶判断符号更稳妥:i为偶数时对应项是
-1/i,i为奇数时对应项是+1/i,不需要额外flag变量。
修正后的可运行代码
#include <stdio.h> int main() { float result = 0.0f; for (int i = 10000; i >= 1; --i) { if (i % 2 == 0) { result -= 1.0f / i; } else { result += 1.0f / i; } } printf("Addition from right to left accumulated in float: %f\n", result); return 0; }
额外说明:浮点数累加时从小到大累加(即从右向左计算这个级数)的精度会高于从大到小累加(从左向右计算),因为大值累加完成后,过小的尾数会因为float的23位有效位限制被截断,造成精度损失。
内容的提问来源于stack exchange,提问作者zion
相关产品推荐
相关产品推荐

