如何在C++中计算欧拉数的前N位 以前200位高精度计算为例
纯C++实现欧拉数前200位计算方案
核心思路
- 放弃
double类型,改用自定义高精度数组实现大数运算,利用欧拉数泰勒展开收敛速度极快的特性完成计算 - 欧拉数的泰勒展开式可变形为嵌套递推形式:
e = 1 + 1/1 * (1 + 1/2 * (1 + 1/3 * (... + 1/n)...)),该形式仅需要实现「高精度数除以小整数」的运算逻辑,不需要复杂的大数四则运算,实现成本极低 - 提前确定计算终止条件:要得到200位有效数字,仅需要计算到n=100左右即可,此时
1/n!的精度已经远低于10^-200,不会对结果产生可观测的影响
具体实现步骤
- 定义一个长度为210的整型数组(或
vector<int>)存储高精度结果,多预留10位空间避免进位误差,每一个数组元素存储结果的一位十进制数 - 初始化数组所有元素为0
- 从n=100开始倒序循环到n=1:
- 对整个高精度数组执行除以n的操作,逐位计算商和余数,余数传递到下一位计算
- 给高精度数组的最低位(对应整数部分)加1
- 循环结束后,数组的首位元素就是欧拉数的整数部分2,后续200位就是所需的小数部分,按顺序输出即可
核心代码片段示例
#include <iostream> #include <vector> using namespace std; int main() { const int PRECISION = 200; vector<int> res(PRECISION + 10, 0); // 预留10位冗余位避免误差 // 倒序递推计算 for (int n = 100; n >= 1; --n) { int carry = 0; // 高精度数除以小整数n的实现 for (int i = 0; i < res.size(); ++i) { int current = res[i] + carry * 10; res[i] = current / n; carry = current % n; } res[0] += 1; // 整数部分加1 } // 格式化输出结果 cout << res[0] << "."; for (int i = 1; i <= PRECISION; ++i) { cout << res[i]; } cout << endl; return 0; }
运行上述代码即可得到欧拉数的前200位有效数字,结果可与标准欧拉数公开数值做校验,误差符合精度要求。
内容的提问来源于stack exchange,提问作者Kemsikov
相关产品推荐
相关产品推荐

