comp.lang.ada
 help / color / mirror / Atom feed
From: Stephen Leake <stephen.a.leake.1@gsfc.nasa.gov>
Subject: Re: Dimensionality Checking (Ada 20XX)
Date: 11 Dec 2001 11:39:30 -0500
Date: 2001-12-11T16:42:42+00:00	[thread overview]
Message-ID: <upu5ln22l.fsf@gsfc.nasa.gov> (raw)
In-Reply-To: 9v37rs$cdmva$1@ID-25716.news.dfncis.de

"Nick Roberts" <nickroberts@adaos.worldonline.co.uk> writes:

> It's easier to demonstrate than to actually explain. Show me a piece of
> (genuine) Ada code that uses a floating point type to hold values that would
> be usefully made unit-specific, and I'll show you how they certainly could,
> and probably should, be held by a fixed point type instead.

http://users.erols.com/leakstan/Stephe/Ada/Sal_Packages/index.htm,
file sal-gen_math-gen_dof_6.ads

This is part of the math library I used to implement robotics control
systems and satellite simulators.

The core type is a 6 dimensional "pose", consisting of a 3 dimensional
position vector (x, y, z) and a 3 dimensional rotation, represented by
a unit quaternion. The position vector should be in meters (or feet,
if you are a barbarian :), the quaternion is unitless.

For robotics, the position is computed by the forward kinematics
function; V = F (theta), where V is the (x, y, z) vector, and 'theta'
is the vector of joint angles.

The joint angles are properly represented by fixed point numbers,
since they have constant error. A joint angle is measured by hardware
with a fixed precision; the value is known to plus or minus 0.001
radians, for example. When you run that thru the function F, which
contains Sin, Cos, multiply, and add, you get a relative error; 'x' is
known to 1 percent. Thus x is properly represented by floating point.

More practically, most computers used for robotics and satellite
simulations support fast floating point, often faster and more precise
than integer. So there is no reason to use fixed point.

> I'm not actually trying to argue that floating point types should
> never be used for non-unitless quantities. 

Good

> All I'm suggesting is that there is no practical need to add the
> unit-specific facility to floating point types. 

I disagree. I started one, and gave up when I hit the combinatorial
explosion others have alluded to. It would be useful to find bugs
during unit test. 

The most practical implementation I've seen stores a count of the
order of the three basic dimensions (mass, length, time) with each
value. Multiply and divide add and subtract those counts; addition and
assignment check them. This is good for finding bugs, but it is too
much overhead for bug-free real-time execution.

> Furthermore, I think it would be horribly painful trying to do so
> (consider Ada.Numerics).

It is horribly painful, but not because of Ada.Numerics.

It is simply wrong to try to define units for trig and exponential
functions. Remember the Taylor expansion for Sin:

Sin (x) = x - 1/6 x**3 ...

If x has dimensions of meters (shudder :), then what are the
dimensions of Sin (x)? This is why angles must be dimensionless, as
radians are.

If you don't take the stored counts approach, you have zillions of
routines to write just sticking with SI units (meters * time,
meters**2 * time, (meters**2 * kg) * time**2, etc). Adding unit
conversion makes it far worse.

-- 
-- Stephe



  parent reply	other threads:[~2001-12-11 16:39 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
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 [this message]
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