[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v2] utils: Add pow2ceil()

From: Eric Blake
Subject: Re: [Qemu-devel] [PATCH v2] utils: Add pow2ceil()
Date: Mon, 23 Feb 2015 14:20:18 -0700
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0

On 02/23/2015 10:40 AM, Markus Armbruster wrote:

>>> int64_t pow2floor(int64_t value)
>>> {
>>>     assert(value > 0);
>>>     return 0x8000000000000000u >> clz64(value);
>>> }
>> Needs to be 0x8000000000000000ull for 32-bit machines to compile correctly.
> Why?

Because 0x8000000000000000u is only required to be a 'long', and on
32-bit machines, your constant would overflow long.  See, for example,
commit 5cb6be2ca.  You NEED the 'll' suffix to ensure that the compiler
doesn't reject the constant as an overflow.

>> Why is the parameter int64_t?  Wouldn't it be more useful to have:
>> uint64_t pow2floor(uint64_t value)
> Crossed my mind, too.  However, the existing callers pass *signed*
> arguments.

I guess it means auditing callers either way.

>>> int64_t pow2ceil(int64_t value)
>>> {
>> Again, why allow signed inputs?
>>>     assert(value <= 0x4000000000000000)
>>>     if (value <= 1)
>>>     return 1;
>> In particular, this slams all negative values to a result of 1, which
>> doesn't necessarily make sense.
> It implements a straightforward contract: return the smallest power of
> two greater or equal to the argument.  The function's domain is the set
> of int64_t arguments where this value can be represented in int64_t,
> i.e. [-2^63..2^62].
> Feel free to suggest a more sensible contract.

But why should I claim that the nearest power of 2 greater than -3 is
positive 1, when I could argue that it should instead be -2 (nearest
positive or negative power of 2 rounding towards +inf) or -4 (nearest
positive or negative power of 2 rounding away from 0)?  Since there are
multiple potential contracts once negative values are involved, I find
it easier to just make the contract require a positive input to begin with.

Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org

Attachment: signature.asc
Description: OpenPGP digital signature

reply via email to

[Prev in Thread] Current Thread [Next in Thread]