[#56982] [ruby-trunk - Bug #8854][Open] Update URL for bug reports — "stomar (Marcus Stollsteimer)" <redmine@...>
7 messages
2013/09/03
[#57038] [ruby-trunk - Feature #3620] Add Queue, SIzedQueue and ConditionVariable implementations in C in addition to ruby ones — "Glass_saga (Masaki Matsushita)" <glass.saga@...>
4 messages
2013/09/05
[#57040] Re: [ruby-trunk - Feature #3620] Add Queue, SIzedQueue and ConditionVariable implementations in C in addition to ruby ones
— SASADA Koichi <ko1@...>
2013/09/05
(2013/09/05 20:52), Glass_saga (Masaki Matsushita) wrote:
[#57058] [ruby-trunk - Bug #8875][Open] Select is not usable with SSLSocket — "headius (Charles Nutter)" <headius@...>
11 messages
2013/09/07
[#57092] [ruby-trunk - Bug #8883][Open] Rational canonicalization unexpectedly converts to Fixnum — "melquiades (Paul Cantrell)" <cantrell@...>
16 messages
2013/09/09
[#57111] [ruby-trunk - Feature #8887][Open] min(n), max(n), min_by(n), max_by(n) — "akr (Akira Tanaka)" <akr@...>
13 messages
2013/09/10
[#57117] [ruby-trunk - Feature #8890][Open] [PATCH] Eliminate less-than-zero checks for unsigned variables — "tonyo (Anton Ovchinnikov)" <revolver112@...>
5 messages
2013/09/10
[#57134] [CommonRuby - Feature #8896][Open] #tap with missing block — "prijutme4ty (Ilya Vorontsov)" <prijutme4ty@...>
5 messages
2013/09/11
[#57138] [ruby-trunk - Feature #8897][Open] client side TCP fast open — "Glass_saga (Masaki Matsushita)" <glass.saga@...>
5 messages
2013/09/11
[#57195] [ruby-trunk - Feature #8897][Assigned] client side TCP fast open
— "Glass_saga (Masaki Matsushita)" <glass.saga@...>
2013/09/14
[#57186] [ruby-trunk - Feature #8909][Open] Expand "f" frozen suffix to literal arrays and hashes — "headius (Charles Nutter)" <headius@...>
37 messages
2013/09/14
[#57224] [ruby-trunk - Feature #8909] Expand "f" frozen suffix to literal arrays and hashes
— "headius (Charles Nutter)" <headius@...>
2013/09/15
[#57262] [ruby-trunk - Feature #8921][Open] Allow select, reject, etc to accept a regex — "kyledecot (Kyle Decot)" <kyle.decot@...>
13 messages
2013/09/18
[#57264] [ruby-trunk - Feature #8921] Allow select, reject, etc to accept a regex
— "kyledecot (Kyle Decot)" <kyle.decot@...>
2013/09/18
[#57265] Re: [ruby-trunk - Feature #8921] Allow select, reject, etc to accept a regex
— Fuad Saud <fuadksd@...>
2013/09/18
Shouldn't select/reject use threequals?
[#57292] [ruby-trunk - Feature #8931][Open] Update URL in REPORTBUG_MSG — "zzak (Zachary Scott)" <e@...>
4 messages
2013/09/20
[#57315] [ruby-trunk - Feature #8938][Open] it keyword — "Sing9898 (Sing Lou)" <3b06e8d4@...>
5 messages
2013/09/23
[#57367] [ruby-trunk - Feature #8951][Open] Please add a hash-to-hash alternative of the map method to Hash — "behrangsa (Behrang Saeedzadeh)" <behrangsa@...>
8 messages
2013/09/25
[#57385] [ruby-trunk - Bug #8953][Open] `str =~ /pattern/` does not call =~ method if (1) str is a String, (2) /pattern/ is a Regexp literal — "gfx (Goro Fuji)" <gfuji@...>
12 messages
2013/09/26
[#57394] [ruby-trunk - Bug #8955][Open] LocalJumpError - no block given (yield) after implementation of class hierarchy method cache invalidation — "mfla (Morten Fla)" <mmflaa@...>
4 messages
2013/09/26
[#57462] [ruby-trunk - misc #8962][Open] [DOC] add step to enable Generational GC merits in README.EXT* — "tad (Tadashi Saito)" <redmine@...>
6 messages
2013/09/28
[ruby-core:57338] Re: [ruby-trunk - Feature #8700] Integer#bitsize (actually Fixnum#bitsize and Bignum#bitsize)
From:
Fuad Saud <fuadksd@...>
Date:
2013-09-23 20:21:08 UTC
List:
ruby-core #57338
I like it. Pretty neat for low level bit brushing stuff. -- Fuad Saud Sent with Sparrow (http://www.sparrowmailapp.com/?sig) On Saturday, August 31, 2013 at 3:47 AM, matz (Yukihiro Matsumoto) wrote: > > Issue #8700 has been updated by matz (Yukihiro Matsumoto). > > > Accepted. It should be work as 2's complement for negative numbers. > > Matz. > > ---------------------------------------- > Feature #8700: Integer#bitsize (actually Fixnum#bitsize and Bignum#bitsize) > https://bugs.ruby-lang.org/issues/8700#change-41474 > > 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/ > >