Double minus zero

  • Thread starter Thread starter Guest
  • Start date Start date
G

Guest

Hi,
Does the Double has the facilty to define -0.

If it has, "==" or System.Math.Sign() doesn't able to differentiate between -0 & 0.

i.e.
Double x = -0.0d
Double y = 0.0d

if(value == -0.0d) {//both x & y drops in this statement.
//is minus zero
}
else {
//Not minus zero
}

How to differentiate -0.0d & 0.0d in if statement?

Thank you,
Avin Patel
 
Avin said:
Hi,
Does the Double has the facilty to define -0.

If it has, "==" or System.Math.Sign() doesn't able to differentiate between -0 & 0.

i.e.
Double x = -0.0d
Double y = 0.0d

if(value == -0.0d) {//both x & y drops in this statement.
//is minus zero
}
else {
//Not minus zero
}

How to differentiate -0.0d & 0.0d in if statement?

Yup - Math.Sign() is documented to return 0 if the double value is 0
(and positive zero is equal to negative zero according to the IEEE spec).

To determine if you have negative zero, I think you'll have to write a
bit of code that looks at the sign bit directly:

public static bool IsSignBitSet( double x) {
byte[] bytes = BitConverter.GetBytes( x);

// this assumes a little-endian machine
return ((bytes[bytes.Length-1] & 0x80) == 0x80);
}


// ...

Console.WriteLine( "IsSignBitSet( +0.0): {0}", IsSignBitSet( +0.0));
Console.WriteLine( "IsSignBitSet( -0.0): {0}", IsSignBitSet( -0.0));

The above code outputs:

IsSignBitSet( +0.0): False
IsSignBitSet( -0.0): True
 
Frank Oquendo said:
How can a sign have any meaning when discussing the absence of a value?

Very easily. -0 and +0 are mathematically distinct when considering
limits, where something can tend to 0 from above or below, for
instance. It's all well-defined in IEEE arithmetic, I believe.
 
mikeb said:
Yup - Math.Sign() is documented to return 0 if the double value is 0
(and positive zero is equal to negative zero according to the IEEE spec).

To determine if you have negative zero, I think you'll have to write a
bit of code that looks at the sign bit directly:

Alternatively, check for whether it's equal to positive 0 but has a
different bit sequence to positive 0 (still using
BitConverter.GetBytes, but regardless of endianness).
 
Jon said:
Alternatively, check for whether it's equal to positive 0 but has a
different bit sequence to positive 0 (still using
BitConverter.GetBytes, but regardless of endianness).

Alright - in the interest of endian-safeness, here's an alternative:

private readonly static long signBit =
BitConverter.DoubleToInt64Bits( -0.0);

public static bool IsSignBitSet( double x) {
long bits = BitConverter.DoubleToInt64Bits( x);

return( (bits & signBit) != 0);
}
 
Avin Patel said:
But compact C# doesn't have " BitConverter.DoubleToInt64Bits()" functionality?

In that case, you can use BitConverter.GetBytes and just compare the
contents of the returned array with BitConverter.GetBytes(0d).
 
Hi,
I guess this should be ok for compact case:
static public bool IsMinusZero(double data)
{
byte[] minuszero =
BitConverter.GetBytes(-0.0);

byte[] bytes = BitConverter.GetBytes(data);

for(int i=0; i<minuszero.Length; i++) {
if(bytes != minuszero) { return false; }
}
return true;
}

Thanks for replies,
Avin Patel
 
Back
Top