【问题标题】:Large multiplication output coming out negative in RubyRuby 中的大乘法输出为负数
【发布时间】:2012-10-19 07:04:09
【问题描述】:

我写了一些代码,应该对 1

sum = 0
(1..1000).each do |n|
  sum += n**n
  puts "n = #{n}, sum = #{sum}"
end

由于某种原因,在 28 号之后输出为负数:

n = 29, sum = -2015400977700573523892329442490139437391867

知道为什么会这样吗?

【问题讨论】:

  • 这是哪个版本的 Ruby?它应该切换到 bignums 以避免溢出/环绕,至少在 1.9.3 和 1.8.7 中是这样。
  • 代码对我来说在 1.8.7 中运行良好,因此到 bignums 的转换在那里也运行良好。这从 n=16 开始。
  • 也许您应该显示为arr = 1..28 获得的输出。
  • 你没有平方它。除了 2 之外,它本身并没有平方。
  • 在 ruby​​ 1.8.7 上,我在迭代 28 上得到负值,但在 ruby​​ 1.9.3 上,我得到了我期望的结果。我怀疑这个算法中的某些东西会诱使 ruby​​ 在它应该使用 Bignum 时不使用它......

标签: ruby integer exponentiation


【解决方案1】:

看起来这是 1.8.7 中的一个错误,已由补丁 358 修复:Exponentiation in Ruby 1.8.7 Returns Wrong Answers

numeric.c 中的power 计算结果在this commit 之前未声明为volatile,之后似乎已修复溢出行为。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 2018-11-05
    • 1970-01-01
    相关资源
    最近更新 更多