From: kst@telesoft.com (Keith Thompson @pulsar)
Subject: Re: Ada Decimal Arithmetic & Representations (ADAR) V1.0 available
Date: Thu, 25 Mar 1993 01:22:15 GMT
Date: 1993-03-25T01:22:15+00:00 [thread overview]
Message-ID: <1993Mar25.012215.26844@telesoft.com> (raw)
In-Reply-To: EACHUS.93Mar23203327@dr_no.mitre.org
In article <EACHUS.93Mar23203327@dr_no.mitre.org> eachus@dr_no.mitre.org (Robert I. Eachus) writes:
> [...]
> In article <1993Mar22.223336.23771@telesoft.com> kst@telesoft.com (Keith Thompson @pulsar) writes:
>
> > Ahem. Actually, it's a shortcoming of the package that it depends
> > on Long_Integer....
>
> > If you want the longest possible integer type (whatever its name
> > happens to be in Standard), use something like this:
>
> > type Longest_Integer is range System.Min_Int .. System.Max_Int;
>
> FLAME ON!!!!
>
> This sort of abstract pontificating has its place, but in this
> case you do a significant disservice in posting something like this
> without looking at the actual packages.
>
> First, most of the use of system dependant types occurs either in
> a configuration package or in examples.
>
> Second, every such case is commented with WHY the decision to
> declare things that way was made.
>
> Third, there are cases where declarations like Longest_Integer
> above will simply not work, because you must use Standard.Integer.
> Two examples are the rules in 3.6.1(2) and the exponentiation
> operators defined in 4.5.6(4).
>
> Forth, well you get the picture...
>
> FLAME OFF.
> [...]
I admit that I was a little quick to attack the package without being
sufficiently familiar with it. Inappropriate use of predefined integer
types happens to be one of my hot buttons. I apologize to the authors
of the ADAR packages for any perceived flame; it was unintentional.
HOWEVER...
The article I was responding to (not written by Robert Eachus) described
the Alsys SPARC compiler's lack of a Long_Integer type as a shortcoming.
This is unfair (IMHO). For the SPARC hardware, it's perfectly appropriate
to define type Integer as 32 bits (it's a 32-bit processor, after all),
and not to define a type Long_Integer (the SPARC doesn't directly support
64-bit arithmetic operations).
Even if one is using only a single compiler/host/target combination, it's
still a good idea to avoid predefined integer types other than Integer.
The choice of how and whether to define types such as Short_Integer and
Long_Integer is an arbitrary one made by the compiler implementers.
It's unlikely that these names really correspond to concepts in
the problem domain; that's what user-defined integer types are for.
(They also keep you from comparing apples and oranges.) Using Integer
is sometimes necessary, as you pointed out; it can also be perfectly
appropriate if all you need is an integer type of "reasonable" size,
range, and efficiency.
I've found that, even if portability isn't a concern (in those extremely
rare cases where you're sure that it will *never* be a concern),
writing software in as portable a fashion as practical tends to make
it cleaner and more easily maintainable. If I'm maintaining a piece of
software that is never intended to run on anything other than a JCN 9000
computer with a FooCorp version 6.9 Ada compiler, I'd still rather deal
with a user-defined integer type than have to remember how the compiler
implementers chose to define Long_Integer. (A brownie point to anyone
who recognizes "JCN 9000").
I offer this as general advice to Ada programmers, not as a criticism of
the ADAR packages. Configuration packages and examples are probably
among the rare cases where direct use of predefined integer types other
than Integer can be appropriate. I do understand the need to get down
close to the hardware and/or compiler when you're writing low-level
numeric software.
Besides, isn't a large part of the purpose of Ada, and of computer
science in general, to bring "abstract pontificating" down into useful
real-life domains?
> Where they can, we did, but for example, find the largest power of ten
> smaller than Integer'LAST in static Ada...)
This isn't pretty, but it should work for anything up to 64-bit
integers. Thanks to Gary Dismukes for the idea.
with Text_IO;
procedure Power is
B01: constant := Boolean'Pos(Integer'Last > 10 ** 1);
B02: constant := Boolean'Pos(Integer'Last > 10 ** 2);
B03: constant := Boolean'Pos(Integer'Last > 10 ** 3);
B04: constant := Boolean'Pos(Integer'Last > 10 ** 4);
B05: constant := Boolean'Pos(Integer'Last > 10 ** 5);
B06: constant := Boolean'Pos(Integer'Last > 10 ** 6);
B07: constant := Boolean'Pos(Integer'Last > 10 ** 7);
B08: constant := Boolean'Pos(Integer'Last > 10 ** 8);
B09: constant := Boolean'Pos(Integer'Last > 10 ** 9);
B10: constant := Boolean'Pos(Integer'Last > 10 ** 10);
B11: constant := Boolean'Pos(Integer'Last > 10 ** 11);
B12: constant := Boolean'Pos(Integer'Last > 10 ** 12);
B13: constant := Boolean'Pos(Integer'Last > 10 ** 13);
B14: constant := Boolean'Pos(Integer'Last > 10 ** 14);
B15: constant := Boolean'Pos(Integer'Last > 10 ** 15);
B16: constant := Boolean'Pos(Integer'Last > 10 ** 16);
B17: constant := Boolean'Pos(Integer'Last > 10 ** 17);
B18: constant := Boolean'Pos(Integer'Last > 10 ** 18);
B19: constant := Boolean'Pos(Integer'Last > 10 ** 19);
B20: constant := Boolean'Pos(Integer'Last > 10 ** 20);
Exponent: constant
:= B01 + B02 + B03 + B04 + B05 + B06 + B07 + B08 + B09 + B10 +
B11 + B12 + B13 + B14 + B15 + B16 + B17 + B18 + B19 + B20;
Largest_Power_Of_Ten: constant := 10 ** Exponent;
begin
Text_IO.Put_Line("Largest_Power_Of_Ten = " &
Integer'Image(Largest_Power_Of_Ten));
Text_IO.Put_Line("Integer'Last = " &
Integer'Image(Integer'Last));
end Power;
--
Keith Thompson (The_Other_Keith) kst@telesoft.com
TeleSoft^H^H^H^H^H^H^H^H Alsys, Inc.
5959 Cornerstone Court West, San Diego, CA, USA, 92121-9891
"Listen to me, people! We must stick them with quills -- it's the only way!"
next prev parent reply other threads:[~1993-03-25 1:22 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
1993-03-19 21:16 Ada Decimal Arithmetic & Representations (ADAR) V1.0 available Michele L. Kee (AdaIC)
1993-03-21 23:12 ` Michael Feldman
1993-03-22 9:53 ` Rolf EBERT
1993-03-22 22:33 ` Keith Thompson @pulsar
1993-03-24 1:33 ` Robert I. Eachus
1993-03-25 1:22 ` Keith Thompson @pulsar [this message]
1993-03-25 21:29 ` Robert I. Eachus
1993-03-25 22:02 ` But it is possible Robert I. Eachus
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox