This
posting went apparently unnoticed, but it may be of interest to the "Dimensional
Analysis" thread. As far as I can tell, the units library I have developed fits
pretty well in the discussion. It has a Dimension "metatype", which is a type
templatised on the seven fundamental dimensions (length, time, and so on).
A magnitude with a dimension is represented as a type templatised on the
underlying quantity type (double, float, three-dimensional vector...) and the
dimension. Units are simply magnitudes with constant values. I have chosen to
use the SI units as fundamental. As has been pointed, it doesn't matter if you
use SI or English or any other unit system, since you are not supposed to really
"see" the raw value stored. Only fundamental units can be constructed "a
priori", and derived units are constructed using fundamental units, as in
"Unit<length> inch=.0254*meter;". Magnitudes can only be constructed by
using units, as in "Magnitude<double, length> width=3.*inch;". They can
only be inspected (by the user) by comparing to units or other magnitudes, as in
"double width_in_miles=width/mile;" (a different syntax may be "double
width_in_miles=convert(width, mile);").
The
temperature issue is dealt with by providing only "temperature difference"
units, since these are convertible by factors, like the other
units. True temperature quantities are computed with using
"scale" types. A scale type is analogous to a unit, but it includes an offset
(e.g. 273.15 for degrees C).
Every
computation involving magnitudes is checked by the compiler for dimensional
soundness. That is, multiplications produce magnitudes with new dimensions, sums
and assignments are only allowed if both magnitudes have the same dimension, and
so on.
By the
way, IMHO the question about mixing gasoline is out of scope, since it is an
altogether different problem, with very different semantics: fundamental
dimensions are not multiplied as in dimensional analysis, but summed. It doesn't
even support the same set of operations (no subtraction, semantics
for multiplication is obscure, no division...).
Miguel
I have developed a small library that allows to do
compile-time computations using rational numbers; it is heavily template-based.
I use as a part of a units library (yet another), in which the dimension is
encoded as seven rational numbers, one for the exponent of each of length, time,
temperature and so on; each of these rational numbers is a template argument for
a magnitude with dimension. (Fractional dimension units are used sometimes, for
example for turbo engine analysis and simulation.)
The compile-time fractions library supports unary
plus and minus, binary plus and minus, multiplication, division, and integer
exponents, and always reduces numerator and denominator, i.e. (4/-6) ->
(-2/3), which makes it possible to test for equality. If there is interest in
this library, I will try and get it into boost's design criteria. Please let me
know.
Miguel
-------------------------------------------------------------------------------------------------------------------
Este correo electrónico y, en su caso, cualquier fichero anexo al mismo, contiene información de carácter confidencial exclusivamente dirigida a su destinatario o destinatarios. Queda prohibida su divulgación, copia o distribución a terceros sin la previa autorización escrita de Indra. En el caso de haber recibido este correo electrónico por error, se ruega notificar inmediatamente esta circunstancia mediante reenvío a la dirección electrónica del remitente.
The information in this e-mail and in any attachments is confidential and solely for the attention and use of the named addressee(s). You are hereby notified that any dissemination, distribution or copy of this communication is prohibited without the prior written consent of Indra. If you have received this communication in error, please, notify the sender by reply e-mail