signbit question

rumbu rumbu at rumbu.ro
Thu Mar 15 17:31:38 UTC 2018


On Thursday, 15 March 2018 at 17:18:08 UTC, Miguel L wrote:
> On Thursday, 15 March 2018 at 16:31:56 UTC, Stefan Koch wrote:
>> On Thursday, 15 March 2018 at 15:28:16 UTC, Miguel L wrote:
>>> Why does std.math.signbit only work for floating point types?
>>> Is there an analogue function for integer types? what is the 
>>> best way to compare the sign of a float with the sign of an 
>>> integer?
>>> Thanks in advance
>>
>> integers don't have a sign-bit.
>> since they are not necessarily singed.
>> However if an integer is signed and using 1-complement
>> you can either do sign = var < 0 or
>> sign = (var & (1 << (sizeof(var)*8 - 1));
>> though I cannot tell which one is faster you have to 
>> experiment.
>
> Thanks. Just one more question:
>
> Is this code correct? I don't care about +0 or -0 as the 
> calculations on f guarantee it cannot be 0 at all.
>
> int a;
> float f;
> ....
> if((a<0)==signbit(f)) {....}
> else {...}

If you are comparing with an integer, please avoid signbit. It 
will return 1 also for -0.0, -inf and -nan.

Don't bother also with signbit for integer types. The compiler 
usually outsmarts the programmer in finding the best way to 
compare an integer with 0.

You can simply write:

if (a < 0 && f < 0) {...}

This will cover the [-inf..0) but not the NaN case. You can test 
it in a separate branch

if (isNaN(f)) {...}





More information about the Digitalmars-d-learn mailing list