# Doubles and zero/negative zero

Discussion in 'C Programming' started by Christopher Benson-Manica, Jun 30, 2004.

1. ### Christopher Benson-ManicaGuest

How does one determine whether a double is equal to -0.0000...? Will
fabs() from math.h return 0.000... on -0.0000...?

--
Christopher Benson-Manica | I *should* know what I'm talking about - if I
ataru(at)cyberspace.org | don't, I need to know. Flames welcome.

Christopher Benson-Manica, Jun 30, 2004

2. ### P.J. PlaugerGuest

"Christopher Benson-Manica" <> wrote in message
news:cbv0n3\$k0e\$...

> How does one determine whether a double is equal to -0.0000...?

You have to use a C99 function such as signbit or copysign to
see the sign bit, because -0 == +0.

> Will
> fabs() from math.h return 0.000... on -0.0000...?

That's what you get with IEEE conformance, but otherwise all bets
are off.

P.J. Plauger
Dinkumware, Ltd.
http://www.dinkumware.com

P.J. Plauger, Jun 30, 2004

3. ### Neil KurzmanGuest

Christopher Benson-Manica wrote:

> How does one determine whether a double is equal to -0.0000...? Will
> fabs() from math.h return 0.000... on -0.0000...?
>
> --
> Christopher Benson-Manica | I *should* know what I'm talking about - if I
> ataru(at)cyberspace.org | don't, I need to know. Flames welcome.

One way would be:

if( (Number < 0) &&( Number > -0.00001))
You get to figure out how many zeros work for you

Neil Kurzman, Jul 1, 2004
4. ### Richard BosGuest

Neil Kurzman <> wrote:

> Christopher Benson-Manica wrote:
>
> > How does one determine whether a double is equal to -0.0000...? Will
> > fabs() from math.h return 0.000... on -0.0000...?

>
> One way would be:
>
> if( (Number < 0) &&( Number > -0.00001))

And, erm... who guarantees that -0.000 < 0?

Richard

Richard Bos, Jul 1, 2004
5. ### WalterGuest

"Neil Kurzman" <> wrote in message
news:...
> Christopher Benson-Manica wrote:
> > How does one determine whether a double is equal to -0.0000...? Will
> > fabs() from math.h return 0.000... on -0.0000...?

> One way would be:
>
> if( (Number < 0) &&( Number > -0.00001))
> You get to figure out how many zeros work for you

That won't work, since (Number<0) will be false for Number=-0. The -0
floating point bit pattern is all 0 bits except the sign bit, which is
turned on. The only time the sign of zero matters is when determining which
side of 0 you're on if you're on a singularity at 0 (called a branch cut).
The IEEE floating point arithmetic routines carefully keep track of -0's,
but to test for it you'll need to check directly for the sign bit, which is
easy enough with:

#include <math.h>

if (signbit(x)) ...

fabs, if implemented correctly, will convert -0 to 0.

Here's a brief introduction to IEEE arithmetic:
www.digitalmars.com/ctg/ctgNumerics.html

Here are some math functions, and what they do with -0:
www.digitalmars.com/rtl/math.html

-Walter
www.digitalmars.com free C/C++/D compilers

Walter, Jul 1, 2004