这是从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
答案 0 :(得分:1)
你的C ints肯定是32位。
2到32的权力是4294967296。
20922789888000 mod 4294967296是2004189184。
答案 1 :(得分:0)
在C版本中你有32位还是64位? long并不总是大于C中的int。