e^x的基本算法——剥离大指数法
(2014-01-28 13:47:59)
标签:
ex泰勒展开式泰勒展开式ex的基本算法——剥 |
e^x的基本算法——剥离大指数法
e^x泰勒展开式
e^x = 1+x+x^2/2!+x^3/3!+……+x^n/n!+……
当x<0.1时,e^x泰勒展开式收缩很快,
当x=1时,e=1+1/1!+1/2!+1/3!+....+1/(n-1)!+.....
=2.718281828459045235360287
当x>1时,e^x泰勒展开式收缩慢,利用 e^(y+z)= (e^y)* (e^z) 把指数的正整数部分和小数部分剥离出来。
整数部分进一步拆分为大整数和小整数,
小数部分进一步拆分为大小数和小小数,
当小小数<0.1时,用e^x泰勒展开式。
用平方,开平方,或e^x泰勒展开式先求出一些基本的e^m值
例如:e^768=(e^384 )^2=(5.87599003828924E+166)^2
=(5.87599003828924^2)*(10^166)^2=3.45272589300743E+333
这已经超过了Excel2003表格的计算上限。但是用科学计数法手工计算乘法很方便。都是10以内的乘法,只不过小数点后拖了十几位数而已。所谓的大数,不过是从10^166一下跳到10^332而已。
一些基本的e^m值表:15位有效数
|
|
|
|
768.000 |
3.45272589300743E+333 |
|
512.000 |
2.28441358653976E+222 |
|
384.000 |
5.87599003828924E+166 |
|
256.000 |
1.51142766500410E+111 |
|
192.000 |
2.42404414941008E+83 |
|
128.000 |
3.88770840599460E+55 |
|
096.000 |
4.92345828601206E+41 |
|
064.000 |
6.23514908081162E+27 |
|
048.000 |
7.01673591209763E+20 |
|
032.000 |
7.89629601826807E+13 |
|
024.000 |
2.64891221298435E+10 |
|
016.000 |
8.88611052050787E+06 |
|
012.000 |
1.62754791419004E+05 |
|
008.000 |
2.98095798704173E+03 |
|
006.000 |
4.03428793492735E+02 |
|
004.000 |
5.45981500331442E+01 |
|
003.000 |
2.00855369231877E+01 |
|
002.000 |
7.38905609893065E+00 |
|
001.500 |
4.48168907033806E+00 |
|
001.000 |
2.71828182845905E+00 |
|
000.800 |
2.22554092849247E+00 |
|
000.500 |
1.64872127070013E+00 |
|
000.400 |
1.49182469764127E+00 |
|
000.250 |
1.28402541668774E+00 |
|
000.200 |
1.22140275816017E+00 |
|
000.125 |
1.13314845306683E+00 |
|
000.100 |
1.10517091807565E+00 |
上表指数有三个系列
指数0.1系列:0.8,0.4,0.2,0.1;
指数1系列:512,256,128,64,32,16,8,4,2,1,0.5,0.25,0.125;
指数3系列:768,384,192,96,48,24,12,6,3,1.5;
其中:指数0.1系列可以被替代合并到指数3系列中,变成
768,384,192,96,48,24,12,6,3,1.5,0.75,0.375,0.1875,0.09375;这在自动筛选中有优势;不过,在我的手工筛选中,看起来不直观,我没采纳。
三个系列指数依次减半,e^m值形成两道交叉拦截网,能快速剥离出上表已知的e^m大乘数,剩下小小乘数,用e^x泰勒展开式求得。
这就是e^x的基本算法——剥离大指数法,戏称“剥洋葱法”。
无论是大乘数,还是小乘数,在有效值范围内都没有误差。结果应该只有末位微小误差。
例1:求e^709.78
[附注]:e^709.78是Excel 2003能算的最大e指数。
解答方法:
与上表一些基本的e^m值比较大小,先减去比自身小的最大指数;剩余数再减去最大指数;直到剩余指数<0.1为止。剩下小小乘数,用e^x泰勒展开式求得。
解:709.78-512=197.78-192=5.78-4=1.78-1.5=0.28-0.25=0.03
我上面连减连等,只是赋值过程,实际等式并不成立。
则e^709.78=e^512*e^192*e^4*e^1.5*e^0.25*(1+0.03+0.03^2/2!+0.03^3/3!+…)
=(2.28441358653976E+222)*( 2.42404414941008E+83)*( 1.49182469764127E+00)
*( 4.48168907033806E+00)*( 1.28402541668774E+00)* (1.03045453395352E+00)
=1.79282279439456E+308
对比
用winXP附件计算器算得e^709.78=1.792822794394564537793394126609e+308
用Excel 2003所算exp(709.78)=1.79282279439452E+308,末位误差4。
例2:求e^609.78
用剥离大指数法算得e^609.78=6.66943700668976E+264
用winXP附件计算器算得e^609.78=6.6694370066897621913640530143816e+264
用Excel 2003所算exp(609.78)=6.66943700668958E+264,次末位误差2,误差超过预期值。
例3:求e^709.75
用winXP附件计算器算得e^609.75=1.739836873264160557698252
用上述另外两种方法算得exp(709.75)=1.73983687326416E+308,
都没有误差。
归纳3例:
我用剥离大指数法 剥离出 无论是大乘数,还是小乘数,在有效值范围内都没有误差。结果没有误差。而用Excel 2003所算exp(x)误差比我的大得多。
Excel 2003能算的e指数上限是e^709.78,
而winXP附件计算器的e指数上限是e^100000,十万!看着吓人,想当然认为运算量惊人,实际上指数翻倍表很快就能达到。只要多存贮十几个数就行。
e指数从768到98304的基本的e^m值表:32位有效数
|
指数m* |
|
|
98304** |
7.669181522922080541564984 |
|
65536** |
8.378494936095998042414765 |
|
49152** |
2.769328713410901775891156 |
|
32768** |
9.153411897263226536143191 |
|
24576** |
1.664130016979112655742306 |
|
16384** |
3.025460609107847323014272 |
|
12288** |
4.079374972932878912185570 |
|
8192*** |
5.500418719613850746074983 |
|
6144*** |
2.019746264492864190772097 |
|
4096*** |
7.416480782428988904819210 |
|
3072*** |
1.421177773711953388137185 |
|
2048*** |
2.723321645055719250124805 |
|
1536*** |
1.192131609224398255632038 |
|
1024*** |
5.218545434367434201121209 |
|
768**** |
3.452725893007433996921737 |
例4:求e^1234.56
解:先逐层剥离大指数
1234.56-1024=210.56-192=18.56-16=2.56-2=0.56-0.5=0.06
则e^1234.56=e^1024* e^192* e^16* e^2* e^0.5* e^0.06
=(5.218545434367434201121209
*(8.88611052050787E+06)*( 7.38905609893065)*( 1.64872127070013)
*(1+0.06+0.06^2/2!+0.06^3/3!+…)
在Excel 2003中先算e^192* e^16* e^2* e^0.5* e^0.06
=2.78641699004831E+91
再乘以5.21854543436743,得1.45410436616604E+92
最后乘以10^444得1.45410436616604E+536
对比
用winXP附件计算器算得
e^1234.56=1.4541043661660424155251073646321e+536
没有误差。

加载中…