comp.lang.ada
 help / color / mirror / Atom feed
From: "David C. Hoos, Sr." <david.c.hoos.sr@ada95.com>
Subject: Re: I think - it's a bug...
Date: Sun, 10 Mar 2002 06:58:37 -0600
Date: 2002-03-10T06:58:37-06:00	[thread overview]
Message-ID: <mailman.1015765141.12692.comp.lang.ada@ada.eu.org> (raw)
In-Reply-To: 3C8B184D.49214059@yahoo.com

This is not a bug.  The problem comes about by not being aware of
the nature of floating point representation in computers.

In your example, the value of dz (0.3) is not exactly representable in
binary -- it is an infinitely repeating binary fraction. Hence, all values of
z that you compute are not exactly representable.

Thus, if the value of dz was rounded upward to the next lsb when
converting from decimal to binary, all values of z will be slightly
larger than their true value.

The only solution is to test the values of which you are about to take
the square root, and if the absolute value is less than some very small
threshold, set the value to 0.0.

Alternatively, if you are sure (given the nature of the problem you
are solving) that z can never be greater than b, you could replace
(z/b) by Float'Min (1.0, z/b).

Additionally, you might want to consider the following statement
from the GNAT User's Guide:
In particular, if the Ada code will do any floating-point operations,
then the FPU must be setup in an appropriate manner. For the case
of the x86, for example, full precision mode is required. The
procedure GNAT.Float_Control.Reset may be used to ensure that
the FPU is in the right state.

Finally you can obtain greater precision by using Long_Float or
Long_Long_Float instead of Float.

----- Original Message -----
From: "Anatoly Chernyshev" <rhezusfactor@yahoo.com>
Newsgroups: comp.lang.ada
To: <comp.lang.ada@ada.eu.org>
Sent: March 10, 2002 2:24 AM
Subject: I think - it's a bug...


> Hello everybody!
>
> Look at this piece of code:
>
> ----------------------------------------------------------------------------
---------------------
>
> WITH ada.text_io,ada.numerics.elementary_functions;
> USE ada.text_io, ada.numerics.elementary_functions;
> PROCEDURE el_stat_fun IS
>    b            : float := 7.5;
>    a:float:=4.0;
>    rr, z : float;
>    r            : float := 4.0;
>    dz           : float := 0.3;
> BEGIN
>    FOR k IN 0..integer(b/dz) LOOP
>       z:=float(k)*dz;
>       put_line (float'image(1.0-(z/b)));
>       rr:=-a*sqrt((1.0-(z/b)**2))+a+r;
>    END LOOP;
> END el_stat_fun;
> ----------------------------------------------------------------------------
------------------------
>
>
>
>
> When compiled using GNAT 3.14 (WinNT sp 6) it raises
> ADA.NUMERICS.ARGUMENT_ERROR in sqrt function when k goes to 25 because
> the argument for sqrt becomes
> negative (like -X.XXXXXE-07 ... And this is a headache No 1).
> However, if one comments out the put_line string - everything works
> fine.
>
> I don't know whether this is a bug or feature, but any kind of help for
> how to avoid the situation when 1.0-1.0/1.0 yields  something different
> from 0.0 will be greatly appreciated.
>
> Thanks in advance,
>
> Anatoly.
>
>
>
>
>
>
> _______________________________________________
> comp.lang.ada mailing list
> comp.lang.ada@ada.eu.org
> http://ada.eu.org/mailman/listinfo/comp.lang.ada
>





  reply	other threads:[~2002-03-10 12:58 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-03-10  8:24 I think - it's a bug Anatoly Chernyshev
2002-03-10 12:58 ` David C. Hoos, Sr. [this message]
2002-03-11  5:33   ` Anatoly Chernyshev
2002-03-11 13:43     ` David C. Hoos
2002-03-11 16:13     ` Stephen Leake
2002-03-11  5:39   ` Jeffrey Carter
2002-03-11 14:53   ` Wes Groleau
2002-03-11 15:15     ` David C. Hoos
2002-03-11  5:32 ` Jeffrey Carter
2002-03-11  5:46   ` Anatoly Chernyshev
2002-03-11  8:19 ` Phil Thornley
2002-03-11 19:48 ` Anatoly Chernyshev
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox