π的计算公式:
虽然,C++里面有关于arctan的系统函数公式,但这篇文章不使用该方法。
直到级数某一值不大于为止。
只要用数学算法转换为计算机执行的步骤就可以了。对于初学者来说,如果认为太麻烦了,可以使用功能分解的方法解决。用不同的函数实现不同的功能,从而实现逐步简化。
double arctan(double x) {
double sqr = x * x;
double e = x;
double r = 0;
int i = 1;
while (e / i > 1e-15) {
double f = e/i;
r = (i % 4 == 1) ? r + f : r - f;
e = e * sqr;
i += 2;
}
return r;
}
sqr 代表平方,用来调整分子的每一次变换。
e 代表每一个分子。
r 用来把接收到的每一次带正负的 f 累加起来。直到 f 的绝对值小于1e-5为止。
i 代表分母。
f 代表每一项的绝对值。
至于为什么在判断时候不写成下面这样:那是因为 f 在大括号内定义的,它的作用于在大括号内。
此时,f 下面出现了波浪线,是未知量。那么,可以这样改:
如果写成while 形式,则必须使 f 的初始化为 e / i ,否则,while (0>1e-15)为假,运行结果为零。
千万不要忘了,后面要改变 f 的值,它随着新的e,i而改变。
1e-15 代表指数: ,是循环截止的标志。
i%4 == 1 用来判断正负号
求余若为 1 则为正号,如5,9......
求余若为 3 则为负号,如3,7.......
r 用来累加。返回arctan最后结果。
全部代码:
#include <iostream>
using namespace std;
double arctan(double x){
double sqr = x * x;
double e = x;
double r = 0;
int i = 1;
while (e / i > 1e-15) {
double f = e / i;
r = (i % 4 == 1) ? r + f : r - f;
e = e * sqr;
i += 2;
}
return r;
}
int main() {
double a = 16.0 * arctan(1 / 5.0);
double b = 4.0 * arctan(1 / 239.0);
cout << "PI = " << a - b << endl;
return 0;
}
主函数里面,a与b的结果,若整数相除结果取整,所以要把除数或被除数其中一个加上小数点。
arctan带入的数同理。
运算结果: