Velocity Reviews > Doubles and zero/negative zero

# Doubles and zero/negative zero

Christopher Benson-Manica
Guest
Posts: n/a

 06-30-2004
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.

P.J. Plauger
Guest
Posts: n/a

 06-30-2004
"Christopher Benson-Manica" <(E-Mail Removed)> wrote in message
news:cbv0n3\$k0e\$(E-Mail Removed)...

> 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

Neil Kurzman
Guest
Posts: n/a

 07-01-2004

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

Richard Bos
Guest
Posts: n/a

 07-01-2004
Neil Kurzman <(E-Mail Removed)> 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

Walter
Guest
Posts: n/a

 07-01-2004

"Neil Kurzman" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed)...
> 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