comp.lang.ada
 help / color / mirror / Atom feed
From: Mats.Weber@matrix.ch (Mats Weber)
Subject: Re: Higher precision and generics
Date: Wed, 15 Mar 1995 15:36:43 GMT
Date: 1995-03-15T15:36:43+00:00	[thread overview]
Message-ID: <Mats.Weber-1503951636430001@mlma11.matrix.ch> (raw)
In-Reply-To: 3jsnbf$ido@nef.ens.fr

In article <3jsnbf$ido@nef.ens.fr>, sands@clipper.ens.fr (Duncan Sands) wrote:

> I am writing a package of matrix routines (in Ada!) in which some
intermediate results
> should be calculated in higher precision than normal.  The type for
normal precision is
> called Real and is a generic parameter of my package:
> generic
>    type Real is digits <>;
> package Matrix_Stuff is
>    ...
> end;
> 
> In the body I would like to be able to declare Double to be a higher precision
> floating point type, something like:
> package body Matrix_Stuff is
>    type Double is digits 2*Real'Digits;
>    ...
> end;
> 
> Unfortunately, this does not compile: apparently formal types like Real
are not
> considered static, so Real'Digits is not considered static, and only static
> expressions are allowed in a "type X is digits expression" declaration.  (If
> I write "type Double is digits 2*Float'Digits" then it compiles fine).
> 
> What can I do to get type Double to be of higher precision than Real?
> Can anyone please help?  And does anyone know why formal types like Real
are not
> considered static?

They are not considered static because the design of Ada's generics leaves
the choice to the implementor as to how generics are implemented. Some
implement generics as templates that are expanded at each instantiation,
and others generate code when the generic itself is compiled. The latter
approach implies that attributes of generic formal parameters cannot be
static.

The work-around in your case is to pass the higher precision type as a
generic parameter, as follows:

generic
   type Real is digits <>;
   type Double_Real is digits <>;
package Matrix_Stuff is
   ...
end;

and then do the precision calculation when you instantiate:

type My_Real is digits ...;
type My_Double_Real is digits 2 * My_Real'Digits;  -- 'Digits is static here
                                                   -- unless My_Real is a 
                                                   -- generic formal.

package My_Matrix_Stuff is new Matrix_Stuff(My_Real, My_Double_Real);

In the body of the generic, you can, if you wish, make a check that the
precision of the actual type is sufficient:

package body Matrix_Stuff is

    ...

begin
   if Double_Real'Digits < 2 * Real'Digits then
       raise Insufficient_Precision;
   end if;
end Matrix_Stuff;

Hope this help...

Mats



  parent reply	other threads:[~1995-03-15 15:36 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
1995-03-11 17:41 Higher precision and generics Duncan Sands
1995-03-14 16:13 ` David Arno
1995-03-15 12:12   ` Duncan Sands
1995-03-17  8:36     ` Dan Kurfis
1995-03-17 12:37       ` Peter Hermann
1995-03-19  1:23         ` Robert Dewar
1995-03-20 16:33           ` Peter Hermann
1995-03-21 21:14             ` Robert Dewar
1995-03-18  1:45       ` Keith Thompson
1995-03-20  9:05       ` dkurfis
1995-03-15 15:36 ` Mats Weber [this message]
1995-03-15 16:35   ` Peter Hermann
replies disabled

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