R:当n较大时,使用`(1+;1/n)^n`近似'e=exp(1)`会给出荒谬的结果

R:当n较大时,使用`(1+;1/n)^n`近似'e=exp(1)`会给出荒谬的结果,r,exponential,R,Exponential,所以,我只是在玩手动计算R中e的值的游戏,我注意到了一些让我有点不安的事情 使用R的exp()命令计算e的值 exp(1) #[1] 2.718282 现在,我将尝试使用x=10000 x <- 10000 y <- (1 + (1 / x)) ^ x y #[1] 2.718146 x <- 100000 y <- (1 + (1 / x)) ^ x y #[1] 2.718268 温暖但还是有点不舒服 x <- 1000000 y <- (1 + (

所以,我只是在玩手动计算R中
e
的值的游戏,我注意到了一些让我有点不安的事情

使用R的
exp()
命令计算
e
的值

exp(1)
#[1] 2.718282
现在,我将尝试使用
x=10000

x <- 10000
y <- (1 + (1 / x)) ^ x
y
#[1] 2.718146
x <- 100000
y <- (1 + (1 / x)) ^ x
y
#[1] 2.718268
温暖但还是有点不舒服

x <- 1000000
y <- (1 + (1 / x)) ^ x
y
#[1] 2.71828

x您的机器精度有问题。只要
(1/x)<2.22e-16
1+(1/x)
就是1。数学极限在有限精度的数值计算中被打破。你在问题中的最后一个
x
已经
5e+15
,非常接近这个边缘。试试
x你也可以试试泰勒级数近似的
exp(1)
,即

e^x = \sum_{k = 0}{\infty} x^k / k!
因此,我们可以通过截断这个和来近似
e=e^1
;在R中:

sprintf('%.20f', exp(1))
# [1] "2.71828182845904509080"
sprintf('%.20f', sum(1/factorial(0:10)))
# [1] "2.71828180114638451315"
sprintf('%.20f', sum(1/factorial(0:100)))
# [1] "2.71828182845904509080"

为什么呢e是我输入的函数的水平渐近线。它不应该接近1。它应该接近e.@self_,也许吧@李哲源 是的,事实上,
sprintf('.70f',sum(1/factorial(0:17))
从R的角度来看已经在数值上等同于
exp(1)
,所以,最好写
sum(1/factorial(17:10))
?有趣!
e^x = \sum_{k = 0}{\infty} x^k / k!
sprintf('%.20f', exp(1))
# [1] "2.71828182845904509080"
sprintf('%.20f', sum(1/factorial(0:10)))
# [1] "2.71828180114638451315"
sprintf('%.20f', sum(1/factorial(0:100)))
# [1] "2.71828182845904509080"