为什么我从这两个函数得到两个非常不同的结果

时间:2009-09-03 02:23:46

标签: ruby factorial

这是从http://www.zenspider.com/ZSS/Products/RubyInline/Readme.html复制的,是rubyinline的“home”,添加了/ moding,如评论中所示

require 'rubygems' #added this, doesn't run otherwise
require 'inline'
class MyTest

  def factorial(n)
    f = 1
    n.downto(2) { |x| f *= x }
    f
  end

  inline do |builder|
    builder.c "
    long factorial_c(int max) {
      int i=max, result=1;
      while (i >= 2) { result *= i--; }
      return result;
    }"
  end
end

#t = MyTest.new()  # removed this
#factorial_5 = t.factorial(5) # removed this

asdf = MyTest.new # added this
puts "ruby native factorial: " + asdf.factorial(16).to_s # added this
puts "inline factorial: " + asdf.factorial_c(16).to_s # added this

当我运行它时,我得到了

ruby​​ testfact.rb

ruby​​ native factorial:20922789888000

inline factorial:2004189184

红宝石版本是正确的;我不知道内联版本是什么(除了不正确)。

我正在运行ruby 1.8.7(2008-08-11 patchlevel 72)[i486-linux];我安装了像这样的rubyinline:sudo gem install RubyInline

我尝试在C代码中将“int”更改为“long”,但它并没有产生差异。 (我不是C程序员,如果那还不明显的话。)

最后,我注意到如果我以12或更少的方式运行它们作为参数,它们都会产生相同的答案。 13岁及以上的事情变得奇怪。

TIA

2 个答案:

答案 0 :(得分:1)

你的C ints肯定是32位。

2到32的权力是4294967296。

20922789888000 mod 4294967296是2004189184。

答案 1 :(得分:0)

在C版本中你有32位还是64位? long并不总是大于C中的int。