计算自然常数e时int与double类型的差异问题
为什么
double i时程序输出自然常数e的近似值,而int i时输出2? 首先看使用double i的代码:
#include <iostream> using namespace std; int main () { double s=0; double i=1; for (int m=1;m<5;m++) { i=m*i; s=s+1/i; } cout<<s+1; return 0; }
这段程序输出的是自然常数e的近似值,而将i改为int类型时,输出结果为2:
#include <iostream> using namespace std; int main () { double s=0; int i=1; for (int m=1;m<5;m++) { i=m*i; s=s+1/i; } cout<<s+1; return 0; }
你可能疑惑:存储结果的s是double类型,为什么i的类型会影响最终计算结果?原因在于除法运算的类型规则:
核心差异:浮点数除法 vs 整数除法
自然常数e的泰勒展开式为:
e = 1 + 1/1! + 1/2! + 1/3! + 1/4! + ...
你的循环m从1到4,本质是计算1 + (1/1! + 1/2! + 1/3! + 1/4!),这正是e的近似值。
当
i是double类型时:1/i执行的是浮点数除法,能完整保留小数部分:- m=1:i=1*1=1 → 1/i=1.0 → s=1.0
- m=2:i=2*1=2 → 1/i=0.5 → s=1.5
- m=3:i=3*2=6 → 1/i≈0.1667 → s≈1.6667
- m=4:i=4*6=24 → 1/i≈0.0417 → s≈1.7083
最后s+1≈2.7083,这就是e的近似值(e≈2.71828)。
当
i是int类型时:1/i执行的是整数除法——C++中两个整数相除,结果会直接舍弃小数部分,只保留整数:- m=1:i=1*1=1 → 1/1=1 → s=1.0
- m=2:i=2*1=2 → 1/2=0(小数部分被舍弃)→ s仍为1.0
- m=3:i=3*2=6 → 1/6=0 → s还是1.0
- m=4:i=4*6=24 → 1/24=0 → s依旧1.0
最后s+1=2.0,所以输出2。
关键结论
虽然s是double类型,但1/i的计算结果类型由i的类型决定:整数除法得到的int结果会被隐式转换为double,但此时小数部分已经丢失,最终导致两种情况的输出差异。
内容的提问来源于stack exchange,提问作者mahmoud mirghani
相关产品推荐
相关产品推荐

