comp.lang.ada
 help / color / mirror / Atom feed
From: "Nick Roberts" <nickroberts@adaos.worldonline.co.uk>
Subject: Re: Dimensionality Checking (Ada 20XX)
Date: Sun, 9 Dec 2001 17:58:14 -0000
Date: 2001-12-09T17:58:14+00:00	[thread overview]
Message-ID: <9v0crt$bo2bi$1@ID-25716.news.dfncis.de> (raw)
In-Reply-To: 11bf7180.0112070815.2625851b@posting.google.com

I'm liking this idea a lot!

Supposing the revision adds a package:


   package Ada.Units

      type Unit_Type is private;

      Unitless : constant Unit_Type;

      Meter    : constant Unit_Type;
      Kilogram : constant Unit_Type;
      Second   : constant Unit_Type;
      Ampere   : constant Unit_Type;
      Kelvin   : constant Unit_Type;
      Mole     : constant Unit_Type;
      Candela  : constant Unit_Type;

      function Is_Unitless (The_Unit: in Unit_Type) return Boolean;

      function "*" (Left, Right: Unit_Type) return Unit_Type;
      function "/" (Left, Right: Unit_Type) return Unit_Type;

      function "**" (Left: Unit_Type; Right: Integer) return Unit_Type;

      function "*" (Left: Unit_Type; Right: universal_real) return
Unit_Type;
      function "*" (Left: universal_real; Right: Unit_Type) return
Unit_Type;
      function "/" (Left: Unit_Type; Right: universal_real) return
Unit_Type;
      function "/" (Left: universal_real; Right: Unit_Type) return
Unit_Type;

   end Ada.Units;


We can declare our own units, e.g.:


   Foot: constant Ada.Units.Unit_Type := Meter * 0.3048;


Then we can declare a 'unit-specific' (fixed-point) type:


   type Accelerometer_Reading is
      delta 0.02 range -4.7 .. +4.7 unit Foot/Second**2;


This form has the problem of introducing a new reserved word ("unit"), but I
feel this is more appropriate, since the unit is an aspect of the 'key
abstraction' of the type (rather than just a matter of implementation or
checking). Fixed-point types could nevertheless have an attribute Unit (with
the special dispensation for reserved words accorded Range etc).

If we then declared e.g.:


   type Acceleration is
      delta 0.01 range -50.0 .. +50.0 unit Meter/Second**2;

   Reading: Accelerometer_Reading;
   Rate_of_Ascent: Acceleration;


we could convert from one type to another the normal way:


   Rate_of_Ascent := Acceleration(Reading);


which would cause a scaling multiplication (if necessary). Furthermore, view
conversions work perfectly:


   procedure Adjust_for_Wind (RoA: in out Acceleration);

   ...

   Adjust_for_Wind(Acceleration(Reading));


The appropriate scaling is performed for the variable Reading on the way in
and (the inverse scaling) on the way out.

Possibly one advantage of this scheme is that a compiler could opt out of
doing the dimension checking without causing any problem (other than the
actual lack of checking, of course!).

The standard type Duration could be declared:


   type Duration is delta ... range ... unit Ada.Units.Second;


Fixed-point types without the 'unit' part in the declaration would default
to being 'unitless'. Predefined operations between a unitless fixed-point
type and a unit-specific one would work as currently, with no dimension
checking, and the reult would also be unitless. This would be vital for
maintaining code continuity, of course, but also I suspect that unitless
fixed-point types would continue to have a vital role as intermediary types
for calculation and other processing.

I don't believe unit specification (and therefore dimension checking) is
applicable to floating-point types. They may be used for various purposes
(perhaps often when a fixed-point type ought to be used), but a
floating-point number is conceptually a ratio, and therefore implicitly
unitless (and dimension-indeterminate). If they are used for intermediate
calculations, that's too bad (a good programmer will take extra precautions
if practicable).

There's the question of private types. I feel that the requisite conversions
and other mixed operations should be provided for a private type explicitly
(in its package spec), and that these operations should do the requisite
conversion and checking, which may well be more complicated than mere
scaling and dimensionality. The unit facilities would, of course, be
applicable to those components which were of unit-specific (fixed-point)
types.

Three further notes need to be made.

(1) I am not sure if the (seven) SI units I have presented are the complete
set of basic units required in reality.

(2) Dimensional analysis could extend (from the basic MLT) to temperature,
amount of matter, and electrical current. But I don't know if it would be
practical for these 'extra' dimensions (or any others) to be included in the
checking.

(3) I have not provided for units that are offset from the SI units' zero
points (which are presumably all at the corresponding 'physical' zero
point). I believe some other post suggested that this tends to be a fairly
cosmetic matter anyway.

--
Best wishes,
Nick Roberts






  reply	other threads:[~2001-12-09 17:58 UTC|newest]

Thread overview: 78+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2001-12-07  0:09 Dimensionality Checking (Ada 20XX) Snodgrass, Britt (NM75)
2001-12-07 16:15 ` Ian
2001-12-09 17:58   ` Nick Roberts [this message]
2001-12-09 22:58     ` Nick Roberts
2001-12-10  0:17     ` Mark Lundquist
2001-12-10  1:51       ` James Rogers
2001-12-10  3:33         ` Nick Roberts
2001-12-10 19:09           ` Nick Roberts
2001-12-11  8:20             ` Thomas Koenig
2001-12-11 15:37               ` Nick Roberts
2001-12-11 20:18                 ` Thomas Koenig
2001-12-12  0:58                   ` Mark Lundquist
2001-12-12  8:19                     ` Wilhelm Spickermann
2001-12-12 14:21                     ` Stephen Leake
2001-12-12 19:10                       ` Nick Roberts
2001-12-13 19:04                         ` Stephen Leake
2001-12-13 22:56                           ` Nick Roberts
2001-12-14  0:11                             ` Nick Roberts
2001-12-14 22:14                       ` Mark Lundquist
2001-12-15  1:30                         ` Nick Roberts
2001-12-10 20:22         ` Thomas Koenig
2001-12-10 17:21       ` Wes Groleau
2001-12-10 19:51         ` Mark Lundquist
2001-12-10 19:56           ` Wes Groleau
2001-12-10 20:37             ` Mark Lundquist
2001-12-10 18:56       ` Nick Roberts
2001-12-11 15:05         ` Wes Groleau
2001-12-11 16:39         ` Stephen Leake
2001-12-11 19:05           ` Nick Roberts
2001-12-11 22:50             ` Mark Johnson
2001-12-12  1:59               ` Nick Roberts
2001-12-11 23:01             ` Stephen Leake
2001-12-12  2:21               ` Nick Roberts
2001-12-12 14:16                 ` Stephen Leake
2001-12-13 19:52                   ` Nick Roberts
2001-12-13 22:22                     ` Nick Roberts
2001-12-14  6:40                       ` Robert C. Leif, Ph.D.
2001-12-14 17:30                       ` Stephen Leake
2001-12-14 17:38                     ` Stephen Leake
2001-12-11 22:45           ` Mark Lundquist
2001-12-12  1:42             ` Nick Roberts
2001-12-12 15:17               ` Mark Lundquist
2001-12-12 14:03             ` Stephen Leake
2001-12-12  9:35           ` Dmitry A. Kazakov
2001-12-12 14:26             ` Stephen Leake
2001-12-13 17:02               ` daniele andreatta
2001-12-13 19:06                 ` Stephen Leake
2001-12-14 10:16                 ` Dmitry A. Kazakov
2001-12-14 22:01                   ` Nick Roberts
2001-12-17 11:10                     ` Dmitry A. Kazakov
2001-12-17 12:16                       ` Thomas Koenig
2001-12-17 14:30                         ` Dmitry A. Kazakov
2001-12-27 17:18                         ` Steven Deller
2001-12-15  7:07                   ` Steven Deller
2001-12-17 12:31                     ` Dmitry A. Kazakov
2001-12-17 13:46                       ` Thomas Koenig
2001-12-17 15:00                         ` Dmitry A. Kazakov
2001-12-17 16:38                         ` Thomas Koenig
2001-12-17 21:07                       ` Britt Snodgrass
2001-12-20 13:44                         ` Dmitry A. Kazakov
2001-12-13 19:33         ` Mark Lundquist
2001-12-13 22:15           ` Nick Roberts
2001-12-14 20:20             ` Mark Lundquist
2001-12-10 23:31       ` Mark Lundquist
2001-12-10 13:57     ` Ian
2001-12-10 17:24       ` Wes Groleau
2001-12-10 20:38       ` Britt Snodgrass
  -- strict thread matches above, loose matches on Subject: below --
2001-12-11 13:11 Mike Brenner
2001-12-11 17:03 ` Mark Lundquist
2001-12-02 16:01 Another Idea for Ada 20XX James Rogers
2001-12-03 14:56 ` Mark Lundquist
2001-12-03 15:12   ` Lutz Donnerhacke
2001-12-03 21:13     ` Dimensionality Checking (Ada 20XX) Nick Roberts
2001-12-04 14:00       ` Dmitry A. Kazakov
2001-12-06 19:52         ` Britt Snodgrass
2001-12-06 20:55           ` Mark Lundquist
2001-12-06 22:38           ` Wes Groleau
2001-12-06 23:12             ` Mark Lundquist
2001-12-07 14:36               ` Wes Groleau
2001-12-07  9:37           ` Dmitry A. Kazakov
2001-12-07 22:51           ` Mark Lundquist
replies disabled

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