落叶 发表于 2018-2-14 10:13:30

发布两个高精计算公式

本帖最后由 落叶 于 2018-2-14 14:00 编辑

我在写高精函数时推导出两个数学公式,在我的程序算法中有比较重要的应用,特分享出来,因在网上没找到相同的公式,所以我以原创的方式发布:
这两个公式都是先找到实例应用,再求理论推导的。
公式原型:Arctan(x)=Arctan(y)+Arctan((x-y)/(1+x*y)),当y无限大时:
Arctan(y)=pi/2,(x-y)/(1+x*y)=-1/x
所以有Arctan(x)=pi/2-Arctan(1/x),,这个公式在计算反正切函数时有重要应用,公式的推导可能有点怪,但这个公式你在任意精度都是百分百正确。
不知能否收入公式大全?
公式原型:ln(x/y)=ln(x)-ln(y)
设x=1,ln(1/y)=0-ln(y);ln(1/y)=-ln(y)      ,这个公式在计算对数函数时有重要应用。
这第一个公式的主要应用是把Arctan函数计算中的极大值转换成更利于泰勒公式计算需要的极小值,从而迅速计算出得数。
第二个公式是计算对数时,中间转换需要用到的,否则有些特殊值会不好算。

zeroieme 发表于 2018-2-15 01:00:59

Arctan(x)= pi/2-Arctan(1/x)    必须x>0

落叶 发表于 2018-2-15 15:08:45

本帖最后由 落叶 于 2018-2-15 15:14 编辑

zeroieme 发表于 2018-2-15 01:00
Arctan(x)= pi/2-Arctan(1/x)    必须x>0

确实如此,感谢你的帮助完善了这个公式!!因为Arctan(-x)=-Arctan(x),我在编程时把负号提出来了,最后再加上所以没发现这个问题。

落叶 发表于 2018-2-17 14:14:43

本帖最后由 落叶 于 2018-2-17 14:32 编辑

找到了反正切函数的两个原型公式:

arctan x + arctan y = arctan(x+y)/(1-x*y)

arctan x - arctan y = arctan(x-y)/(1+x*y)

先测试第一个公式:
x=2;
y=999;
atan(x)+atan(y) = 2.6769440439223212569161966738468;
atan((x+y)/(1-x*y)) = -4.6464860966747198154644670943267e-1;
x=-2;
y=999;
atan(x)+atan(y) = 4.6264660833414025088206575348976e-1;
atan((x+y)/(1-x*y)) = 4.6264660833414025088206575348976e-1;
x=2;
y=-999;
atan(x)+atan(y) = -4.6264660833414025088206575348976e-1;
atan((x+y)/(1-x*y)) = -4.6264660833414025088206575348976e-1;
x=-2;
y=-999;
atan(x)+atan(y) = -2.6769440439223212569161966738468;
atan((x+y)/(1-x*y)) = 4.6464860966747198154644670943267e-1;

可以看出只有x和y的符号相反时公式才能成立。

再测试第二个公式:

x=2;
y=999;
atan(x)-atan(y) = -4.6264660833414025088206575348976e-1;
atan((x-y)/(1+x*y)) = -4.6264660833414025088206575348976e-1;
x=-2;
y=999;
atan(x)-atan(y) = -2.6769440439223212569161966738468;
atan((x-y)/(1+x*y)) = 4.6464860966747198154644670943267e-1;
x=2;
y=-999;
atan(x)-atan(y) = 2.6769440439223212569161966738468;
atan((x-y)/(1+x*y)) = -4.6464860966747198154644670943267e-1;
x=-2;
y=-999;
atan(x)-atan(y) = 4.6264660833414025088206575348976e-1;
atan((x-y)/(1+x*y)) = 4.6264660833414025088206575348976e-1;
可以看出只有x和y的符号一致时公式才能成立。

但网上资料介绍此两公式时并没有加限制条件!!!???

现在以第二个公式推导高精计算需要用到的反正切函数公式:

公式原型:Arctan(x)=Arctan(y)+Arctan((x-y)/(1+x*y)),x和y的符号必须相同,且x≠0;

当x>0;y正无限大时:
Arctan(y)=pi/2,(x-y)/(1+x*y)=-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)

zeroieme 发表于 2018-2-17 22:45:07

余角正切值互为倒数的逆定理。

落叶 发表于 2018-2-18 20:17:12

本帖最后由 落叶 于 2018-2-18 20:32 编辑

zeroieme 发表于 2018-2-17 22:45
余角正切值互为倒数的逆定理。

tan(123) = 5.1792747158565518313192407563929e-1;
1/tan(π/2-123) = 5.1792747158565518313192407563929e-1;

在网上查了一下,有个别网页提到余角正切值互为倒数这个定理。这个定理还是比较容易理解和证明的。
我上面论证推导从另一个角度证明了它的逆定理的正确性。
不过要是直接用逆定理的原理,加速反正切函数的泰勒计算,却很不容易想到这方面上来。

落叶 发表于 2018-2-27 11:53:37

前两天查到这个公式:Arctan(a)+Arctan(1/a)=pi/2;
网页链接:https://baike.baidu.com/item/arctan/8318716
页: [1]
查看完整版本: 发布两个高精计算公式