Prev: What is your preferred VCS?
Next: GPS 2010 for AVR
From: Henrique on 29 Jul 2010 08:23 Hi, I have some problems in converting float variables in Ada. Look at the code below. Why var4 is not equal var1? Thanks. -- Execution results: -- var3: = var4: > -- Code: -- with Ada.Text_IO, Ada.Float_Text_IO; use Ada.Text_IO, Ada.Float_Text_IO; procedure Test is type My_Float is digits 6; CONVERSION_CONSTANT : constant My_Float := 6076.11; CONVERSION_CONSTANT2 : constant My_Float := 1.0 / CONVERSION_CONSTANT; package Float_Text_IO is new Ada.Text_IO.Float_IO (Long_Float); use Float_Text_IO; var1: My_Float := 999.9; var2: My_Float := var1*CONVERSION_CONSTANT; var3: My_Float := var2/CONVERSION_CONSTANT; var4: My_Float := var2*CONVERSION_CONSTANT2; begin Put("var3: "); if var3 = var1 then Put("="); elsif var3 > var1 then Put(">"); else Put("<"); end if; New_Line; Put("var4: "); if var4 = var1 then Put("="); elsif var4 > var1 then Put(">"); else Put("<"); end if; end Test;
From: Jacob Sparre Andersen on 29 Jul 2010 08:44 Henrique <henriquemagalhaes(a)gmail.com> wrote: > Why var4 is not equal var1? > type My_Float is digits 6; > > CONVERSION_CONSTANT : constant My_Float := 6076.11; > CONVERSION_CONSTANT2 : constant My_Float := 1.0 / CONVERSION_CONSTANT; > > var3: My_Float := var2/CONVERSION_CONSTANT; > var4: My_Float := var2*CONVERSION_CONSTANT2; Basically because the relative precision of My_Float is limited to 1e-6. In general "=" does not make much sense for floating point types. Cheers, Jacob -- Jacob Sparre Andersen Research & Innovation Vesterbrogade 148K, 1. th. 1620 K�benhavn V Danmark Phone: +45 21 49 08 04 E-mail: jacob(a)jacob-sparre.dk Web-sted: http://www.jacob-sparre.dk/
From: Dmitry A. Kazakov on 29 Jul 2010 08:46 On Thu, 29 Jul 2010 05:23:42 -0700 (PDT), Henrique wrote: > I have some problems in converting float variables in Ada. Look at the > code below. > > Why var4 is not equal var1? Because they are not. Floating-point operations are inexact. -- Regards, Dmitry A. Kazakov http://www.dmitry-kazakov.de
From: Georg Bauhaus on 29 Jul 2010 10:56 On 29.07.10 14:23, Henrique wrote: > package Float_Text_IO is new Ada.Text_IO.Float_IO (Long_Float); (Any reason you didn't instantiate with My_Float?) For illustration, inserting Put(Var3, Aft => 15) and Put(Var4, Aft => 15), I get $ ./test_fpt var3: 9.999000244140625E+02= var4: 9.999000854492188E+02> Choosing 15 digits instead of 6 in the type definition, I get $ ./test_fpt var3: 9.999000000000000E+02= var4: 9.999000000000001E+02> There is always a FPT computation that isn't giving the exact result, since there aren't enough bits for doing real math on any computer, if you try hard enough. Georg
From: Georg Bauhaus on 29 Jul 2010 11:08
On 29.07.10 14:46, Dmitry A. Kazakov wrote: > On Thu, 29 Jul 2010 05:23:42 -0700 (PDT), Henrique wrote: > >> I have some problems in converting float variables in Ada. Look at the >> code below. >> >> Why var4 is not equal var1? > > Because they are not. Floating-point operations are inexact. > Interestingly, a quick rewrite to C translated with gcc gives a different impression (of equality), #include <stdio.h> int main() { typedef float My_Float; #define CONVERSION_CONSTANT 6076.11 const My_Float CONVERSION_CONSTANT2 = 1.0 / CONVERSION_CONSTANT; My_Float Var1 = 999.9; My_Float Var2 = Var1*CONVERSION_CONSTANT; My_Float Var3 = Var2/CONVERSION_CONSTANT; My_Float Var4 = Var2*CONVERSION_CONSTANT2; fputs("var3: ", stdout); printf("%.15f", Var3); if (Var3 = Var1) fputs("=", stdout); else if (Var3 > Var1) fputs(">", stdout); else fputs("<", stdout); fputs("\n", stdout); fputs("var4: ", stdout); printf("%.15f", Var4); if (Var4 = Var1) fputs("=", stdout); else if (Var4 > Var1) fputs(">", stdout); else fputs("<", stdout); fputs("\n", stdout); return 0; } $ ./a.out var3: 999.900024414062500= var4: 999.900085449218750= |