From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham autolearn_force=no version=3.4.4 X-Google-Thread: 103376,86d4e48d5a9b02a1 X-Google-NewGroupId: yes X-Google-Attributes: gida07f3367d7,domainid0,public,usenet X-Google-Language: ENGLISH,ASCII-7-bit Path: g2news2.google.com!news2.google.com!npeer02.iad.highwinds-media.com!news.highwinds-media.com!feed-me.highwinds-media.com!news.glorb.com!news2.glorb.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: Niklas Holsti Newsgroups: comp.lang.ada Subject: Re: Cannot summate small float values Date: Sun, 21 Nov 2010 23:18:31 +0200 Organization: Tidorum Ltd Message-ID: <8ktgl8Fmg4U1@mid.individual.net> References: <8kq1usFojgU1@mid.individual.net> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Trace: individual.net mNrq8gWCpMAWWGX4cSrh0wwRQK5wFwgibQ4IbaBEl6WP7kGs0O Cancel-Lock: sha1:+FgSEnXZ0RsKlK5hVgukaf2rBL0= User-Agent: Mozilla-Thunderbird 2.0.0.24 (X11/20100328) In-Reply-To: Xref: g2news2.google.com comp.lang.ada:16603 Date: 2010-11-21T23:18:31+02:00 List-Id: tolkamp wrote: > On 20 nov, 14:49, Niklas Holsti wrote: >> tolkamp wrote: >>> When I summate Float values smaller then 1.0E-6 then the summation is >>> not done. >>> Code Example: >>> X, Dx : Float; >>> X := 0.0; >>> Dx := 1.0E-7; >>> lwhile X < 1.0 loop >>> X = X + Dx; >>> Float_Io.Put(X, 3,9,0); New_Line; >>> end loop; >> Certainly the addition is done. Your program (after some small syntactic >> corrections) prints: >> >> 0.000000100 >> 0.000000200 >> 0.000000300 >> 0.000000400 >> 0.000000500 >> 0.000000600 >> 0.000000700 >> >> and so on. If your program prints out something else, please show the >> source code of your whole program, exactly as you compile and run it. >> Don't re-type it into your message. >> >> However, when X approaches 1.0, at some point the addition of 1.0E-7 may >> be lost in round-off, since it is close to the precision limit of the >> Float type, relative to 1.0. On my system (Debian, Gnat) the X variable >> does reach 1.0 and the program stops. >> >> What are you really trying to do? There are probably safer and more >> accurate ways of doing it. >> >> Here is the program that I used: >> >> with Ada.Text_IO; >> with Ada.Float_Text_IO; >> >> procedure Sums >> is >> use Ada.Text_IO, Ada.Float_Text_IO; >> X, Dx : Float; >> begin >> X := 0.0; >> Dx := 1.0E-7; >> while X < 1.0 loop >> X := X + Dx; >> Put(X, 3,9,0); New_Line; >> end loop; >> end Sums; >> > > Thank you your reaction. > Using your procedure Sums I found out that when the start value of X < > 0.24 the summation works correct with Dx = 1.0E-8 > When start X > 0.25 the summation remains 0.250000000. That is still correct behaviour, because floating point addition can behave like that when the two addends have very different magnitudes. If you need to compute the sum of a large set of floating-point numbers, you should use a floating-point type with more digits or use a smart summation algorithm like the one by Kahan, http://en.wikipedia.org/wiki/Kahan_summation_algorithm -- Niklas Holsti Tidorum Ltd niklas holsti tidorum fi . @ .