[Haskell-cafe] bitSize

Daniel Fischer daniel.is.fischer at googlemail.com
Fri Aug 26 20:02:59 CEST 2011

On Friday 26 August 2011, 19:24:37, Andrew Coppin wrote:
> On 26/08/2011 02:40 AM, Daniel Peebles wrote:
> > And as Daniel mentioned earlier, it's not at all obvious what we mean
> > by "bits used" when it comes to negative numbers.
> I guess part of the problem is that the documentation asserts that
> bitSize will never depend on its argument. (So would will write things
> like "bitSize undefined :: ThreadID" or similar.)

I don't think that's a problem, it's natural for what bitSize does. And it 
would be bad if bitSize did something different for Integer than for Int, 
Word, ...

> I can think of several possible results one might want from a bit size
> query:

Yup, though for some there are better names than bitSize would be.

> 1. The number of bits of precision which will be kept for values of this
> type. (For Word16, this is 16. For Integer, this is [almost] infinity.)

Not "almost infinity", what your RAM or Int allow, whichever cops out 
first, or "enough, unless you [try to] do really extreme stuff".

> 2. The amount of RAM that this value is using up. (But that would surely
> be measured in bytes, not bits. And processor registors make the picture
> more complicated.)
> 3. The bit count to the most significant bit, ignoring sign.
> 4. The bit count to the sign bit.
> Currently, bitSize implements #1. I'm not especially interested in #2. I
> would usually want #3 or #4.

I'd usually be more interested in #2 than in #4.

> Consider the case of 123 (decimal). The 2s complement representation of
> +123 is
> ...0000000000000001111011
> The 2s complement representation of -123 is
> ...1111111111111110000101
> For query #3, I would expect both +123 and -123 to yield 7.

One could make a case for the answer 3 for -123, I wouldn't know what to 
expect without it being stated in the docs.

> For query
> #4, I would expect both to yield 8. (Since if you truncate both of those
> strings to 8 bits, then the positive value starts with 0, and the
> negative one start with 1.)

#4 would then generally be #3 + 1 for signed types, I think, so not very 
interesting, but for unsigned types?

> Then of course, there's the difference between "count of the bits" and
> "bit index", which one might expect to be zero-based. (So that the Nth
> bit represents 2^N.)

Yes, but that shouldn't be a problem with good names.

So, which of them are useful and important enough to propose for inclusion?

More information about the Haskell-Cafe mailing list