471,122 Members | 1,015 Online

# Double minus zero

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
Nov 16 '05 #1
8 4333 Avin Patel wrote:
How to differentiate -0.0d & 0.0d in if statement?

How can a sign have any meaning when discussing the absence of a value?

--
Things never go according to plan. So plan accordingly.
Nov 16 '05 #2
Avin Patel wrote:
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

--
mikeb
Nov 16 '05 #3
mikeb <ma************@nospam.mailnull.com> wrote:
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:

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 Skeet - <sk***@pobox.com>
http://www.pobox.com/~skeet
Nov 16 '05 #4
Frank Oquendo <no******@here.com> wrote:
How to differentiate -0.0d & 0.0d in if statement?

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.

--
Jon Skeet - <sk***@pobox.com>
http://www.pobox.com/~skeet
Nov 16 '05 #5
Jon Skeet [C# MVP] wrote:
mikeb <ma************@nospam.mailnull.com> wrote:
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:

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);
}
--
mikeb
Nov 16 '05 #6
Hi Mikeb,
But compact C# doesn't have " BitConverter.DoubleToInt64Bits()" functionality?

"mikeb" wrote:
Jon Skeet [C# MVP] wrote:
mikeb <ma************@nospam.mailnull.com> wrote:
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:

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);
}
--
mikeb

Nov 16 '05 #7
Avin Patel <Av*******@discussions.microsoft.com> wrote:
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).

--
Jon Skeet - <sk***@pobox.com>
http://www.pobox.com/~skeet
Nov 16 '05 #8
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[i] != minuszero[i]) { return false; }
}
return true;
}

Thanks for replies,
Avin Patel

"Avin Patel" wrote:
Hi Mikeb,
But compact C# doesn't have " BitConverter.DoubleToInt64Bits()" functionality?

"mikeb" wrote:
Jon Skeet [C# MVP] wrote:
mikeb <ma************@nospam.mailnull.com> wrote:

>>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:
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);
}
--
mikeb

Nov 16 '05 #9

### This discussion thread is closed

Replies have been disabled for this discussion.

### Similar topics

 17 posts views Thread by Suzanne Vogel | last post: by 6 posts views Thread by RobG | last post: by 53 posts views Thread by Zhiqiang Ye | last post: by 3 posts views Thread by Joakim Hove | last post: by 13 posts views Thread by Marc | last post: by 5 posts views Thread by soeren | last post: by 60 posts views Thread by Erick-> | last post: by 116 posts views Thread by Dilip | last post: by 11 posts views Thread by Steven Woody | last post: by reply views Thread by MartianBanks | last post: by reply views Thread by anoble1 | last post: by reply views Thread by clicknium | last post: by reply views Thread by autodeveloper | last post: by reply views Thread by autodeveloper | last post: by 1 post views Thread by Osama3bdelwahab | last post: by reply views Thread by Synco | last post: by 2 posts views Thread by sleach | last post: by 6 posts views Thread by CJ_London | last post: by