反正切函数的根本实现方法还是泰勒展开式逼近,但它不能单独采用,必须使自变量X趋进这个函数曲线的平滑度最高的点,这个点的收敛速度最快,反正切函数arctan(x)的这个点是0和无穷大。
这里采用趋近零的方法,arctan(x)中的x的值大多是没法用泰勒展开式计算或计算量太大,时间太长。
这里需要通过反正切公式推导出合适的新的公式,把对 Arctan(x)的直接运算转换成arctan(0.000…xxx)运算,然后通过公式反算回去:
公式原型:Arctan(x)=Arctan(y)+Arctan((x-y)/(1+xy)),x和y的符号必须相同,且x≠0;
当x>0;y正无限大时:
Arctan(y)=pi/2,(x-y)/(1+xy)=-1/x
所以有:Arctan(x)=pi/2-Arctan(1/x)
当x<0;y负无限大时(或无限小时):
Arctan(y)=-pi/2,(x-y)/(1+x*y)=-1/x
所以有:Arctan(x)=-pi/2-Arctan(1/x)
公式原型:Arctan(x)+Arctan(y)=Arctan((x+y)/(1-xy)),x和y的符号必须相同,且x≠0;
当x=y时;2Arctan(y)=Arctan((y+y)/(1-y*y))=Arctan(2y/(1-y^2));
设 x=2y/(1-y^2);
这个公式只能通过y算出x值,我们需要的是通过 x算出y;
解 x=2y/(1-y^2),
可以算出y=((1+x ^ 2)^0.5-1)/x.
这时我们可以通过Arctan(x)=pi/2-Arctan(1/x)把大于1的数换成小于1的数,就是x=1/x.
再通过y=((1+x ^ 2)^0.5-1)/x的重复套用,使y的值转换成合适的0.000…xxx。
把转换成的数通过泰勒展开式运算,运算到指定精度返回。
返回后的运算:套用了两个公式时:最终结果=pi/2-(泰勒展开式运算的返回值)×2 ^ (重复套用次数)
或只套用了第二个公式:最终结果=(泰勒展开式运算的返回值)×2^(重复套用次数)。
例:计算Arctan(5);x=1/5;y=((1+x ^ 2) ^ 0.5-1)/x;x=y;y=((1+x ^ 2) ^ 0.5-1)/x;x=y;y=((1+x ^ 2)^0.5-1)/x;
此时y的值是2.4679453700615472487480378578057e-2
pi/2-Arctan(2.4679453700615472487480378578057e-2)×2^3=1.373400766945015860861271926445;
Arctan(5)= 1.373400766945015860861271926445;