3

このCコードでRubyを拡張することにより、RubyテストでテストしているCモジュールがあります。2 ** 24 -1 を超える数値は変更されています。Ruby と C の間で 64 ビット値をやり取りする必要があり、ビット精度である必要があります。任意の考えをいただければ幸いです。

in c extension:
long int sig_val;
sig_val = NUM2LL(sig) // sig is type VALUE and is ruby number to be passed on to C

. . . 私が渡したデータのいくつかの例:

  • (2^34 -1) * 16 ==> C は (2^34) * 16 を受け取ります
  • (2^34 +1) * 16 ==> C は (2^34) * 16 を受け取ります
  • (2^24 +1) * 16 ==> C は (2^24) * 16 を受け取ります
  • (2^25 -1) ==> C が (2^25) を受け取る
  • (2^24 -1) ==> C が (2^24 -1) を受け取る (正解)

以下の数字も正解です。

ありがとうございました!

4

1 に答える 1

0

この質問を「未回答」フィルターから削除するために、コメントから回答をコピーします。

コード内に float への型キャストがあり、Ruby がビット数を 24 に制限していることに気付きました (シングル ポイント IEEE754 によると思います)。これで、NUM2LL と LL2NUM を使用して 64 ビット幅の数値を渡すことができます。ありがとうございました

〜aalaviあたりの回答

于 2013-10-10T06:18:09.577 に答える