From: Andy Little (andy_at_[hidden])
Date: 2005-10-12 14:29:30


"Matt Calabrese" wrote

> I'm not going to make bad code easy to write by allowing points to be added
> with operator +.

You seem to be making good code more difficult to write though. :-(

> Again, this is why in geometry you don't normally define
> addition of points, since on its own it makes no sense.

hmm.... Geometry does define addition of points....

> In reality it only
> makes sense as an implementation detail of a higher-level operation.

As you confirm here... ;-)

> For
> instance, the rare case you mention.

Addition is pretty common e.g for curves, for piecewise integrals(e.g Simpsons
rule) etc. Physical data is noisy more often then not.

> and that I mention are still very easily
> expressible without the need for operator + to be defined. I suggested
> providing a function such as average( t1, t2, t3, t4, t5, t6 ), which
> internally uses component-wise addition through my componentwise_add
> function (NOT using operator +).

You havent actually removed addition. You've just given it a
non-obvious name. ;-)

> As I said, I will provide this and
> barycentric combination function templates to cover those situations, but
> I'm not going to overload operator + for points, since it isn't a logical
> operation on its own and would just allow for illogical expressions, such as
> just the addition of the temperature at the beginning of the day with the
> temperature at the end of the day.

I dont see how changing the name of the function helps. componentwise_add is an
addition right?

> If I really want to go far, using
> expression templates I could allow addition to compile only if it is a
> direct subexpression of a multiplicative expression containing division, or
> if the expression follows the form of a barycentric combination, but that
> would be going overboard.

For true safety you would need to check the calculation-constants are correct.
OTOH... maybe I want to accumulate my values in a container....?
You would need to do the check at runtime in that case.

[cut]

> On 10/11/05, Andy Little wrote:
>>
> What do you do when two quantities have the same dimensional signature eg
>> torque
>> and energy?
>
> Then the division of one by the other results in a type having
> "empty_classification" (which is the derived classification used by angles,
> etc. as with SI Units).

The term used by the SI is dimensionless.
I believe that the radian and steradian are described as dimensionless derived
units.

Whatever...You need a means to distinguish dimensionally-equivalent types for
output purposes.

> On 10/11/05, Andy Little wrote:
>>
> The other area I worked hard at was dimensionless results for which I
>> returned
>> the promoted value_type of the operands. It would have been easy to
>> provide a
>> dimensionless quantity but this too would fail in "rare cases".
>
> I provide a dimension-less quantity called empty_classification, since it
> provides more information and is safer than a raw value.

Ah right. OK .Sorry I should have said "numeric results" rather than
dimensionless
results. A numeric type needs no extra information. Only when you have other
information (as with angles) will a record of the extra information be
necessary. When there is no extra information there is no reason not to return
a numeric type.

> I understand why
> one might think it a good idea to result in just the raw value as opposed to
> an encapsulated one, but I don't believe it is the correct decision.

Well the decision to use numeric types where possible as opposed to a
dimensionless udt works fine in pqs. I have no reason to believe it was the
wrong decision. It
makes the library directly compatible with inbuilt types. Its easy to use and
there are no oddities to learn.

> I.E. Both radians and degrees have an
> empty_classification, yet have different unit types and their values mean
> different things.

Ok.

> If you just result in the raw value as opposed to a
> quantity specifying units, you lose all of the unit information.

Well numeric types by nature dont have any unit information. I guess you could
add scalinfg of eg *10^3 etc, but really all you are doing is creating an
extended
floating point type.

> Now that
> you have lost the unit information, using the value in an operation with
> other units of empty_classification would be seemingly ambiguous. For
> instance, I do not believe it is a good idea to allow for
>
> quantity< degrees >( 180. ) + 3.14159

> By your logic, such an expression would have to be allowable.

No... OTOH ...

quantity<radians>(pi ) + 3.14159 ;

... I would have no problem with.

hmmm. You could add angle to the base-units, but then an angle quantity
wouldnt be strictly dimensionless. It would have a dimension of {mass(0),
length(0),.., angle(1)}. In pqs I made various distinctive types of angle
separating them overall into two major types; fractions_of_revolution which
comprised degrees,minutes etc. and radians. radians has an implicit conversion
to and from a numeric type whereas the other types needed to be converted to
radians and then to a numeric type. Previously I was against adding angle to
the base-units but it might be worth revisting that, though I would try to keep
similar semantics to those I have in pqs currently.

> However, it
> really should not, since 3.14159, while is of empty_classification, does not
> state which unit type it has. Obviously here it is in radians, which happens
> to be the natural unit type of empty_classification, but you can never be
> sure of this and so shouldn't even always just assume raw values are in
> radians.

In pqs I assume that raw values are numeric. radians are different its true.

> One of the main purposes of a library like this is to make
> operations more typesafe, whereas what you suggest actually has the opposite
> effect.

To be honest I'm nopt sure what I am meant to have suggested.. :-(

> Another example is forming an angle in radians via a ratio:
>
> circumference_in_meters / radius_in_meters
>
> The resultant expression is a quantity in radians and should have that unit
> information accessible, despite that it is of empty classification.

dimensionless... sure.

> Your
> approach would have it be a raw value without units associated with it which
> just results in a loss in type information.

Thats fine if there is no requirement for 'type information', which is the case
with numeric types.

regards
Andy Little