On 3/15/2018 12:39 PM, Miguel L wrote:
On Thursday, 15 March 2018 at 17:31:38 UTC, rumbu wrote:
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:
[...]
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)) {...}
There are various in my code there are more than two variables, and i'd
like to check when their signs differ.I am trying to avoid this, maybe
there is no point in it:
if(!((a>=0 && f>=0) || (a<0 && f<0))){
//signs are different
....
}
Thanks, anyway
You could simplify that to this:
if ((a < 0) != (f < 0))
{
}
Or if you have more than two variables you could do something like this:
bool AllSameSign(double[] args ...)
{
//Only need to check if there are more than one of them
if (args.length > 1)
{
//Compare arg[0] to all the other args.
for (int i = 1; i < args.length; i++)
{
if ((args[0] < 0) != (args[i] < 0))
{
return false;
}
}
}
return true;
}
Which you could call like this, with as many variables as you like:
AllSameSign(a,f);