[#56333] [CommonRuby - Feature #8723][Open] Array.any? predicate returns true for empty array. — "nurettin (Nurettin Onur TUGCU)" <onurtugcu@...>
[#56368] [ruby-trunk - Bug #8730][Open] "rescue Exception" rescues Timeout::ExitException — "takiuchi (Genki Takiuchi)" <[email protected]>
2013/8/28 nobu (Nobuyoshi Nakada) <[email protected]>:
[#56389] [ruby-trunk - Feature #8738][Open] Integer#single_bit? (Actually Fixnum#single_bit? and Bignum#single_bit?) — "akr (Akira Tanaka)" <akr@...>
[#56407] [ruby-trunk - misc #8741][Open] email notification on bugs.ruby-lang.org is broken — "rits (First Last)" <redmine@...>
[#56517] Re: [ruby-cvs:49638] zzak:r42496 (trunk): * lib/time.rb: [DOC] Document constants by @markijbema [Fixes GH-377] — Tanaka Akira <akr@...>
2013/8/11 <[email protected]>:
[#56523] [ruby-trunk - Bug #8769][Open] [PATCH] process.c (rb_fork_internal): remove cloexec setting — "normalperson (Eric Wong)" <normalperson@...>
[#56524] [ruby-trunk - Bug #8770][Open] [PATCH] process.c: avoid EINTR from Process.spawn — "normalperson (Eric Wong)" <normalperson@...>
[#56536] [ruby-trunk - Feature #8772][Open] Hash alias #| merge, and the case for Hash and Array polymorphism — "trans (Thomas Sawyer)" <redmine@...>
[#56551] [CommonRuby - Feature #8777][Open] Process.mach_absolute_time — "tenderlovemaking (Aaron Patterson)" <tenderlove@...>
[#56567] [ruby-trunk - Feature #8780][Assigned] DBM#to_h alias for #to_hash — "zzak (Zachary Scott)" <e@...>
[#56569] [ruby-trunk - Feature #8781][Open] Use require_relative() instead of require() if possible — "ko1 (Koichi Sasada)" <redmine@...>
(2013/08/12 15:35), ko1 (Koichi Sasada) wrote:
(2013/08/13 2:25), drbrain (Eric Hodel) wrote:
On Tue, Aug 13, 2013 at 07:38:01AM +0900, SASADA Koichi wrote:
(2013/08/16 14:21), Aaron Patterson wrote:
On Fri, Aug 16, 2013 at 03:00:59PM +0900, SASADA Koichi wrote:
Em 16-08-2013 03:24, Aaron Patterson escreveu:
On Fri, Aug 16, 2013 at 09:35:04AM -0300, Rodrigo Rosenfeld Rosas wrote:
On Sat, Aug 17, 2013 at 07:17:50AM +0900, trans (Thomas Sawyer) wrote:
(13/08/17 13:13), Aaron Patterson wrote:
[#56634] [ruby-trunk - Feature #8788][Open] use eventfd on newer Linux instead of pipe for timer thread — "normalperson (Eric Wong)" <normalperson@...>
(2013/08/16 10:47), normalperson (Eric Wong) wrote:
SASADA Koichi <[email protected]> wrote:
Hi
KOSAKI Motohiro <[email protected]> wrote:
[#56658] [ruby-trunk - Feature #8796][Open] Use GMP to accelerate Bignum operations — "akr (Akira Tanaka)" <akr@...>
[#56672] Re: [ruby-cvs:49733] eregon:r42591 (trunk): * process.c (rb_clock_gettime): document CLOCK_REALTIME and — Tanaka Akira <akr@...>
2013/8/17 <[email protected]>:
On 17 August 2013 02:52, Tanaka Akira <[email protected]> wrote:
[#56746] [ruby-trunk - Bug #8803][Open] Another buffer overflow — "user021 (a s)" <user021@...>
[#56753] [ruby-trunk - Feature #8804][Open] ONCE syntax — "ko1 (Koichi Sasada)" <redmine@...>
[#56762] [ruby-trunk - Bug #8805][Open] Ruby GC::Profiler returns incorrect info on Solaris (and relatives) — "sax (Eric Saxby)" <sax@...>
[#56780] [ruby-trunk - Feature #8809][Open] Process.clock_getres — "akr (Akira Tanaka)" <akr@...>
[#56795] [ruby-trunk - Bug #8816][Open] Tempfile.new may return the same name for parallel calls — "375gnu (Hleb Valoshka)" <redmine@...>
[#56809] [ruby-trunk - Feature #8820][Open] Speed up Array#index — "trans (Thomas Sawyer)" <redmine@...>
"trans (Thomas Sawyer)" <[email protected]> wrote:
[#56824] [ruby-trunk - Feature #8823][Open] Run trap handler in an independent thread called "Signal thread" — "ko1 (Koichi Sasada)" <redmine@...>
2013/8/27 ko1 (Koichi Sasada) <[email protected]>:
[#56839] [ANN] Ruby Developer Meeting 20130831 — "NARUSE, Yui" <naruse@...>
Hi,
Hi,
[#56861] [ruby-trunk - Feature #3620] Add Queue, SIzedQueue and ConditionVariable implementations in C in addition to ruby ones — "ko1 (Koichi Sasada)" <redmine@...>
"ko1 (Koichi Sasada)" <[email protected]> wrote:
[#56866] [ruby-trunk - Feature #8834][Open] Kernel#load_relative — "sawa (Tsuyoshi Sawada)" <sawadatsuyoshi@...>
[#56890] [ruby-trunk - Feature #8839][Open] Class and module should return the class or module that was opened — "headius (Charles Nutter)" <headius@...>
[#56894] [ruby-trunk - Feature #8840][Open] Yielder#state — "marcandre (Marc-Andre Lafortune)" <ruby-core@...>
[#56911] [ruby-trunk - Feature #8846][Open] Publicize Module#include — "matsuda (Akira Matsuda)" <ronnie@...>
[ruby-core:56303] [ruby-trunk - Feature #8700] Integer#bitsize (actually Fixnum#bitsize and Bignum#bitsize)
Issue #8700 has been updated by akr (Akira Tanaka).
File bitlength.patch added
akr (Akira Tanaka) wrote:
> There are several software which has similar feature.
>
> * Python 3.1 has int.bit_length().
> http://docs.python.org/dev/library/stdtypes.html
> http://docs.python.org/3.1/whatsnew/3.1.html
> http://bugs.python.org/issue3439
>
> * Java java.math.BigInteger has bitLength() method.
> http://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html#bitLength()
>
> * Mathematica has BitLength.
> http://reference.wolfram.com/mathematica/ref/BitLength.html
>
> * GMP has mpz_sizeinbase(n, base).
> http://gmplib.org/manual/Miscellaneous-Integer-Functions.html
>
> * NetBSD 5.0 has ilog2().
> http://netbsd.gw.com/cgi-bin/man-cgi?ilog2++NetBSD-6.0
I look out more.
* Go has BitLen.
http://golang.org/pkg/math/big/#Int.BitLen
* OpenSSL has BN_num_bits.
http://www.openssl.org/docs/crypto/BN_num_bytes.html
* LibTomMath has mp_count_bits.
http://libtom.org/
* gcrypt has gcry_mpi_get_nbits.
http://www.gnupg.org/documentation/manuals/gcrypt/Bit-manipulations.html
* Scala has bitLength.
http://www.scala-lang.org/api/current/index.html#scala.math.BigInt
* CommonLisp has integer-length.
http://www.lispworks.com/documentation/HyperSpec/Body/f_intege.htm
* CLN has integer_length.
http://www.ginac.de/CLN/cln.html#Exact-numbers
They behaves on negative values for absolute value or two's complement as follows.
absolute value, ceil(log2(abs(n)+1)):
Python (bit_length)
Go (BitLen)
GMP (mpz_sizeinbase)
OpenSSL (BN_num_bits)
LibTomMath (mp_count_bits)
gcrypt (gcry_mpi_get_nbits)
two's complement, ceil(log2(n < 0 ? -n : n+1)):
Java (bitLength)
Scala (bitLength)
Mathematica (BitLength)
CommonLisp (integer-length)
CLN (integer_length)
It seems "bit length" is more common than other names.
So I changed the method name to "bitlength".
Both absolute value and two's complement are common.
I think it's difficult to say one is better.
(My patch's bitlength is absolute value.)
How do you think, matz?
----------------------------------------
Feature #8700: Integer#bitsize (actually Fixnum#bitsize and Bignum#bitsize)
https://bugs.ruby-lang.org/issues/8700#change-40795
Author: akr (Akira Tanaka)
Status: Open
Priority: Normal
Assignee:
Category:
Target version:
How about adding Integer#bitsize (actually Fixnum#bitsize and Bignum#bitsize)?
Integer#bitsize returns the position of the most significant bit in the absolute value.
(The position of the least significant bit is 1.)
It returns 0 if no bit set (i.e. the value 0).
Mathematically, n.bitsize is ceil(log2(abs(n)+1)).
Sometimes we want to know the size of a integer.
* Determine the size of an integer in some format.
Although there are various formats, bitsize is a key property to determine the result size.
Several examples:
* If a format is 4 bytes for absolute value, it overflows if 32 <= n.bitsize.
* If a format is 4 bytes for sign bit with absolute value, it overflows if 31 <= n.bitsize.
* If a format is 4 bytes for 2's complement format, it overflow if 31 <= n.bitsize && n != -2**31.
* BER-compressed integer needs (n.bitsize+6)/7 bytes when n > 0.
BER-compressed integer is an example of VLQ.
http://en.wikipedia.org/wiki/Variable-length_quantity
* Elias gamma coding needs 2*n.bitsize-1 bits.
https://en.wikipedia.org/wiki/Elias_gamma_coding
* Elias delta coding needs 2*n.bitsize.bitsize+n.bitsize-2 bits.
https://en.wikipedia.org/wiki/Elias_delta_coding
* bitsize may be used to estimate the time or space cost of an algorithm.
For example, the result size of integer multiplication, x*y, is x.bitsize + y.bitsize.
The number of comparisons of binary search is sorted_array.length.bitsize, etc.
This is because n.bitsize is an approximation of log2(abs(n)).
So Math.log2 can be used for this purpose too.
However bitsize may be preferable if floating point error is not desirable.
There are several software which has similar feature.
* Python 3.1 has int.bit_length().
http://docs.python.org/dev/library/stdtypes.html
http://docs.python.org/3.1/whatsnew/3.1.html
http://bugs.python.org/issue3439
* Java java.math.BigInteger has bitLength() method.
http://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html#bitLength()
* Mathematica has BitLength.
http://reference.wolfram.com/mathematica/ref/BitLength.html
* GMP has mpz_sizeinbase(n, base).
http://gmplib.org/manual/Miscellaneous-Integer-Functions.html
* NetBSD 5.0 has ilog2().
http://netbsd.gw.com/cgi-bin/man-cgi?ilog2++NetBSD-6.0
I think there are two concerns for this issue.
* method name
* behavior for zero and negative number
I named the method as bitsize, mainly because
there is Fixnum#size and Bignum#size.
However I'm open for other names such as:
* bitlength
* numbits
* ilog2
* maxbit
Some names may suggest different behavior, though.
The behavior for zero and negative number is not trivial.
Python adopts ceil(log2(abs(n)+1)) but
Java and Mathematica adopts ceil(log2(n < 0 ? -n : n+1)).
The difference is absolute number v.s. 2's complement number.
Some people may prefer ilog2, which name suggests ilog2(0) raise an error.
I choose ceil(log2(abs(n)+1)). (i.e. absolute number, same as Python).
I think absolute number is easier to understand than 2's complement for many people.
I attached the implementation as bitsize.patch.
The patch implements both Bignum#bitsize and Fixnum#bitsize in bignum.c.
It is because Fixnum#bitsize uses bitsize macro and it is defined in bignum.c.
Maybe, the macro should be moved to internal.h and the implementation of
Fixnum#bitsize should be moved to numeric.c.
Any comments?
--
http://bugs.ruby-lang.org/