0

これは、ルビインラインの「ホーム」であるhttp://www.zenspider.com/ZSS/Products/RubyInline/Readme.htmlからコピーされ、コメントに示されているように追加/変更されます。

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

私がそれを実行すると、私は得ます

ルビーtestfact.rb

ルビーネイティブ階乗:20922789888000

インライン階乗:2004189184

ルビーのバージョンは正しいです。インラインバージョンが何であるかわかりません(正しくないことを除いて)。

私はruby1.8.7(2008-08-11パッチレベル72)[i486-linux]を実行しています。私は次のようにrubyinlineをインストールしました:sudo gem install RubyInline

Cコードで「int」を「long」に変更してみましたが、違いはありませんでした。(まだ明らかでない場合は、私はCプログラマーではありません。)

最後に、引数として12以下で両方を実行すると、どちらも同じ答えが得られることに気付きました。13歳以上では物事がおかしくなります。

TIA

4

2 に答える 2

1

あなたのCintは間違いなく32ビットです。

2の32乗は4294967296です。

20922789888000mod4294967296は2004189184です。

于 2009-09-03T02:49:00.570 に答える
0

Cのバージョンでは、32ビットまたは64ビットの長いものがありますか?longはCのintより常に大きいとは限りません。

于 2009-09-03T02:37:58.060 に答える