Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Best way to create Bignum from C extension

Reply
Thread Tools

Best way to create Bignum from C extension

 
 
Tom Werner
Guest
Posts: n/a
 
      09-25-2007
I've been hand-translating some Ruby code into C for an extension and
have come across the need to create and return a Bignum from the
extension. I see that there is a macro INT2NUM that will produce a
Bignum from long or long long, but what is the best way to create an
arbitrarily sized Bignum from a byte array packed as:

[a, b, c] -> (a * (256 ** 0)) + (b * (256 ** 1)) + (c * (256 ** 2))

in other words, reversing the array and flatting it would produce the
correct binary representation of the number.

I tried creating a Fixnum with INT2FIX(0) and then using rb_funcalls to
incrementally construct a Bignum, but that approach 1) didn't seem to
work past WORD sized numbers and 2) seems like it would be awfully slow.

--
Tom Preston-Werner

* Libraries:
Chronic (chronic.rubyforge.org)
God (god.rubyforge.org)
Fuzed (fuzed.rubyforge.org)
* Site:
rubyisawesome.com


 
Reply With Quote
 
 
 
 
Tom M
Guest
Posts: n/a
 
      09-26-2007
On Sep 25, 1:32 pm, Tom Werner <(E-Mail Removed)> wrote:
> I've been hand-translating some Ruby code into C for an extension and
> have come across the need to create and return a Bignum from the
> extension. I see that there is a macro INT2NUM that will produce a
> Bignum from long or long long, but what is the best way to create an
> arbitrarily sized Bignum from a byte array packed as:
>
> [a, b, c] -> (a * (256 ** 0)) + (b * (256 ** 1)) + (c * (256 ** 2))
>
> in other words, reversing the array and flatting it would produce the
> correct binary representation of the number.
>
> I tried creating a Fixnum with INT2FIX(0) and then using rb_funcalls to
> incrementally construct a Bignum, but that approach 1) didn't seem to
> work past WORD sized numbers and 2) seems like it would be awfully slow.
>
> --
> Tom Preston-Werner
>
> * Libraries:
> Chronic (chronic.rubyforge.org)
> God (god.rubyforge.org)
> Fuzed (fuzed.rubyforge.org)
> * Site:
> rubyisawesome.com


dumb question probably, but could you use scientific notation style
numbers; i.e., 1.076 * 10^10? You'd return a base as a float and an
exponent as a fixnum, and then you could calculate it on the fly...

 
Reply With Quote
 
 
 
 
Tom Werner
Guest
Posts: n/a
 
      09-26-2007
Tom M wrote:
> On Sep 25, 1:32 pm, Tom Werner <(E-Mail Removed)> wrote:
>
>> I've been hand-translating some Ruby code into C for an extension and
>> have come across the need to create and return a Bignum from the
>> extension. I see that there is a macro INT2NUM that will produce a
>> Bignum from long or long long, but what is the best way to create an
>> arbitrarily sized Bignum from a byte array packed as:
>>
>> [a, b, c] -> (a * (256 ** 0)) + (b * (256 ** 1)) + (c * (256 ** 2))
>>
>> in other words, reversing the array and flatting it would produce the
>> correct binary representation of the number.
>>
>> I tried creating a Fixnum with INT2FIX(0) and then using rb_funcalls to
>> incrementally construct a Bignum, but that approach 1) didn't seem to
>> work past WORD sized numbers and 2) seems like it would be awfully slow.
>>
>> --
>> Tom Preston-Werner
>>
>> * Libraries:
>> Chronic (chronic.rubyforge.org)
>> God (god.rubyforge.org)
>> Fuzed (fuzed.rubyforge.org)
>> * Site:
>> rubyisawesome.com
>>

>
> dumb question probably, but could you use scientific notation style
> numbers; i.e., 1.076 * 10^10? You'd return a base as a float and an
> exponent as a fixnum, and then you could calculate it on the fly...
>
>
>
>


No, the reason I need to do this is to read in Erlang's packed data
representation. Interestingly enough, that *is* how Erlang transmits floats!

--
Tom Preston-Werner

* Libraries:
Chronic (chronic.rubyforge.org)
God (god.rubyforge.org)
Fuzed (fuzed.rubyforge.org)
* Site:
rubyisawesome.com


 
Reply With Quote
 
Tom M
Guest
Posts: n/a
 
      09-26-2007
On Sep 26, 2:49 pm, Tom Werner <(E-Mail Removed)> wrote:
> Tom M wrote:
> > On Sep 25, 1:32 pm, Tom Werner <(E-Mail Removed)> wrote:

>
> >> I've been hand-translating some Ruby code into C for an extension and
> >> have come across the need to create and return a Bignum from the
> >> extension. I see that there is a macro INT2NUM that will produce a
> >> Bignum from long or long long, but what is the best way to create an
> >> arbitrarily sized Bignum from a byte array packed as:

>
> >> [a, b, c] -> (a * (256 ** 0)) + (b * (256 ** 1)) + (c * (256 ** 2))

>
> >> in other words, reversing the array and flatting it would produce the
> >> correct binary representation of the number.

>
> >> I tried creating a Fixnum with INT2FIX(0) and then using rb_funcalls to
> >> incrementally construct a Bignum, but that approach 1) didn't seem to
> >> work past WORD sized numbers and 2) seems like it would be awfully slow.

>
> >> --
> >> Tom Preston-Werner

>
> >> * Libraries:
> >> Chronic (chronic.rubyforge.org)
> >> God (god.rubyforge.org)
> >> Fuzed (fuzed.rubyforge.org)
> >> * Site:
> >> rubyisawesome.com

>
> > dumb question probably, but could you use scientific notation style
> > numbers; i.e., 1.076 * 10^10? You'd return a base as a float and an
> > exponent as a fixnum, and then you could calculate it on the fly...

>
> No, the reason I need to do this is to read in Erlang's packed data
> representation. Interestingly enough, that *is* how Erlang transmits floats!
>
> --
> Tom Preston-Werner
>
> * Libraries:
> Chronic (chronic.rubyforge.org)
> God (god.rubyforge.org)
> Fuzed (fuzed.rubyforge.org)
> * Site:
> rubyisawesome.com


something like breaking up the string into substrings and then calling
unpack on each substring, then reassemling... think 'get_more_digits'
since you're already inclined towards Erlang...

 
Reply With Quote
 
Paul Brannan
Guest
Posts: n/a
 
      09-28-2007
On Wed, Sep 26, 2007 at 02:32:08AM +0900, Tom Werner wrote:
> I've been hand-translating some Ruby code into C for an extension and
> have come across the need to create and return a Bignum from the
> extension. I see that there is a macro INT2NUM that will produce a
> Bignum from long or long long, but what is the best way to create an
> arbitrarily sized Bignum from a byte array packed as:
>
> [a, b, c] -> (a * (256 ** 0)) + (b * (256 ** 1)) + (c * (256 ** 2))
>
> in other words, reversing the array and flatting it would produce the
> correct binary representation of the number.
>
> I tried creating a Fixnum with INT2FIX(0) and then using rb_funcalls to
> incrementally construct a Bignum, but that approach 1) didn't seem to
> work past WORD sized numbers and 2) seems like it would be awfully slow.


Take a look at the rb_big_* functions declared in intern.h. I think you
can work something out using them.

Paul


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Questions on implementing a floating point bignum package mike3 C++ 2 12-16-2007 09:34 PM
Internet Explorer Browser Extension: Switching from Live to Development and back again with a browser extension or BHO--how to create it? Danny Javascript 11 06-27-2007 01:50 PM
Where can I get a manual or a BIGNUM pakage? (bn.h) Zero C Programming 6 11-07-2003 06:01 PM
Re: Really-bignum arithmetic Glen Herrmannsfeldt C Programming 7 09-09-2003 07:40 PM
Re: Really-bignum arithmetic Glen Herrmannsfeldt C++ 2 09-09-2003 07:40 PM



Advertisments