找回密码
 欢迎注册
楼主: liangbch

[擂台] 计算百万位e

[复制链接]
发表于 2008-12-15 08:38:17 | 显示全部楼层
也不说明x的定义域,你不会搞个复数出来吧。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-12-15 12:36:38 | 显示全部楼层
当然是实数 复数的话我就写sin,cos了 我只想知道x很大很大的时候怎么算比较快
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-12-15 13:37:33 | 显示全部楼层
简单的说说我的想法,当e很小的时候,接近于0, 计算$e^x$,可用泰勒公式求解,这个就不多说了。我这了说说如何将计算 $e^y$ 转化为$e^x$的算法过程,y是任意正实数,x是一个非常接近于0的数。 1.首先准备一个对数张,这个表格包含2列,第一列是一个数,第二列是这个数的自然对数, 如
'10/9
0.105360515658
'9/8
0.117783035656
'6/5
0.182321556794
'5/4
0.223143551314
'4/3
0.287682072452
'3/2
0.405465108108
'8/5
0.470003629246
'5/3
0.510825623766
'9/5
0.587786664902
2
0.693147180560
'20/9
0.798507696218
'9/4
0.810930216216
'12/5
0.875468737354
'5/2
0.916290731874
'8/3
0.980829253012
3
1.098612288668
4
1.386294361120
5
1.609437912434
6
1.791759469228
8
2.079441541680
9
2.197224577336
10
2.302585092994
容易看出,只要计算出2,3,5这3个小质数的对数,就可以很容易求出上面这个表,当然你可以使用更多的质数的对数,得到表项(更密集)更多的表。 下面我们我们说一下,如何利用这个表,来计算$e^x$ , 我们 以 $r= e ^ 2008.12151318 $为例来说明计算过程 1. 2008.12151318 大于表的最后一个表项log(10), 用 2008.12151318 /log(10) ,得到整数部分872,尾数0.2673120891921=2008.12151318-ln(10)*872 则 $r= e ^ 2008.12151318 =10^872 * e^0.2673120891921 $ 2. 对 0.2673120891921 ,我们查表的得到log(5/4)=0.2231435513142, 因此有 $r=10^872 * 5/4 * e^(0.2673120891921-0.2231435513142)$ $=10^872 * 5/4 * e^0.0441685378779$ 此时,0.0441685378779非常小了,很容易利用泰勒公式得到。 如果你觉得这个值利用泰勒公式收敛的还是有点慢,那么你可以使用更多的小质数的对数,制造一个含有更多表项的对数表。 [ 本帖最后由 liangbch 于 2008-12-15 14:54 编辑 ]
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-12-15 13:59:30 | 显示全部楼层
liangbch我在考虑 是否有个只用单精度计算 就能得到对数的32位十进制数值的 方法 如果按你上面的方法 是否只要有一些小质数的精确到48位数的10的对数值 能否以很快的方法得到16位整数的精确到32位的10的对数
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-12-15 14:30:07 | 显示全部楼层

回复 63# liangbch 的帖子

流程中第一步推导有误! $r=e^2008.12151318 = e^{872.11609216528*ln(10)} $  $ = (e^ln(10))^872.11609216528 = 10^{872 + .11609216528}$  $ = 10^.11609216528 xx 10^872$ 也就是说,经过换底公式后,就不再存在以 $e$ 为底的指数运算了。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-12-15 14:55:51 | 显示全部楼层

回复 65# gxqcn 的帖子

63楼 的确有问题,谢谢指正。 现在63#的步骤已经更正。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-12-15 15:01:33 | 显示全部楼层

回复 64# 无心人 的帖子

对于32有效数字的对数计算,完全使用系统提供的数据类型仍然不可行。你需要实现 1.多精度加减法 2.多精度 乘以/除以 单精度的乘除法。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-12-15 15:17:01 | 显示全部楼层
恩 明白了 你分析过终止条件么? 懒得分析 呵呵 另外,呵呵 完全用2的对数迭代 和用一个8位的数字的对数迭代 比如99999999的对数迭代 哪个效果好?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-12-15 16:54:33 | 显示全部楼层
原帖由 无心人 于 2008-12-15 15:17 发表 恩 明白了 你分析过终止条件么? 懒得分析 呵呵 另外,呵呵 完全用2的对数迭代 和用一个8位的数字的对数迭代 比如99999999的对数迭代 哪个效果好?
不明白你的意思?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-12-15 17:07:23 | 显示全部楼层
to liangbch: 既然已经通过换底公式将底数换成了10, 那何不接下来就一直在10进制下计算乘幂? 我的意思是 10^x (0
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2025-1-22 23:42 , Processed in 0.026200 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表