ruby - 在 Ruby 中,计算数字 e 时出现意外结果

标签 ruby

在 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/

相关文章:

ruby-on-rails - 渲染另一个 Controller 的 View

ruby-on-rails - 使用 rubocop 的 Atom Beautify Ruby 不起作用

ruby - Amazon Selling Partner API - 签名请求(ruby 实现)

ruby-on-rails - 组合多维数组的第一个元素

mysql - 最小化数据库查询

ruby - 在非 Rails 项目中使用 `wicked_pdf`

ruby-on-rails - Rails 2 - partials : what does @comment = Comment. new 是什么意思?

ruby-on-rails - Rails 5 测试弃用警告

ruby-on-rails - 使用 Sunspot 从 Solr 索引中排除文章草稿

css - 无法使用 rails helpers image_tag 或 image_path 在 Google map 上显示本地镜像图标