在 ruby 中,我尝试用它的显式公式计算 e:
(1+(1/t))**t
在irb中,我记下了这个
(1.0+(1.0/100000000000000))**100000000000000
给我 2.716110034087023 接近 e,如我所料。我试着增加 第 10 次。
(1.0+(1.0/1000000000000000))**1000000000000000
给我 3.035035206549262 并且不靠近 e。 (非预期结果)。好吧,我尝试将数字增加 10 倍。
(1.0+(1.0/10000000000000000))**10000000000000000
这个结果是 1.0 -(好的,这可能是语言边界)
但是,意外结果 3.035035206549262 是什么意思?这是错误还是什么?
最佳答案
这不是错误,而是错误floats表现。 Ruby float 是 double precision ,因此当您的公式使用 1E-15 或更小的值时,您不能期待任何精确的结果。
这也是银行不使用 float 而是使用代表较小单位(例如美分)的整数的原因。
如果你想计算 e
,你可以使用另一个公式(例如 the sum of infinite series ),它不依赖于非常小的 float 和非常大的幂。作为奖励,它收敛得非常快,所以 17 项对于浮点精度就足够了:
fact = 1.0
e = (1..17).inject(1) do |mem, i|
fact *= i
mem + 1/fact
end
puts e
#=> 2.7182818284590455
puts e-Math::exp(1)
#=> 4.440892098500626e-16
BigDecimal
也可以作为替代方案,但对于基本上是 1**∞
的公式来说,它不会有太大帮助。 .
有BigMath
, 然而。这将输出 e
的 1000 位有效数字:
BigMath.exp(1,1000).to_s('F')
#=> 2.718281828459045235360......
关于ruby - 在 Ruby 中,计算数字 e 时出现意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41931489/