Java中使用n项交错级数近似计算ln2的代码错误如何修正?
代码错误分析
- 符号判断逻辑缺失else分支
修改后的代码中if判断没有加else限制,当i为偶数时,先执行ln = ln - 1/i,之后无论if是否成立都会执行ln = ln + 1/i,偶数项的加减操作直接抵消,最终只有奇数项会正常累加,结果不符合预期。
- 符号判断逻辑缺失else分支
- 旧代码冗余嵌套内层循环
最初的版本额外加了完全没必要的k变量内层循环,还写错了循环终止条件,实际上不需要额外变量,直接通过i的奇偶判断符号即可。
- 旧代码冗余嵌套内层循环
- 整数除法精度问题
代码中直接写1/i,Java中两个int类型运算会触发整数除法,比如1/2的结果是0而非0.5,会导致计算完全错误,需要改成1.0/i触发浮点数除法。
- 整数除法精度问题
- 测试用例注释残留错误
你代码里测试用例的注释是之前误以为要计算ln(n)的旧残留,当前作业需求是计算ln2的近似值,n是级数取的项数,真实ln2≈0.693,n越大结果越接近这个值,和输入n本身的自然对数无关。
- 测试用例注释残留错误
修正后可运行代码
public class aprox_log { static double findLn (int n) { double ln = 0; for (int i = 1; i <= n; i++) { if (i%2 == 0) { ln = ln - (1.0/i); } else { ln = ln + (1.0/i); } } return ln; } public static void main(String[] args) { //输出前n项级数得到的ln2近似值,n越大越接近真实值≈0.69314718056 System.out.println(findLn(2)); // 前2项:1-1/2=0.5 System.out.println(findLn(5)); // 前5项:1-1/2+1/3-1/4+1/5≈0.78333333333 System.out.println(findLn(10)); // 前10项≈0.64563492063 System.out.println(findLn(9)); // 前9项≈0.74563492063 System.out.println(findLn(1)); // 前1项=1 // 大n测试,结果会非常接近ln2的真实值 System.out.println(findLn(10000)); } }
内容的提问来源于stack exchange,提问作者Sarah Yang
相关产品推荐
相关产品推荐

