paholg / dimensioned

Compile-time dimensional analysis for various unit systems using Rust's type system.
https://crates.io/crates/dimensioned
MIT License
300 stars 23 forks source link

Angles (Radians/Degrees) #5

Closed brendanzab closed 8 years ago

brendanzab commented 8 years ago

Should these be in a separate crate? I would like to derive the Radians unit from SI (m * m^-1), and have a conversion to/from Degrees. Then also make trigonometry functions with the correct units, as I do in cgmath::angle.

droundy commented 8 years ago

Radians should be dimensionless, which is likely to cause trouble with tracking them in terms of units.

paholg commented 8 years ago

Is there a problem with doing something like this?

make_units! {
    Angles, Unitless, one;
    base {
        Degree, degree, °;
    }
}

Then you have degrees and can use Unitless for radians. Using the SI system with 1 radian = m * m^-1 gives you the same thing for radians.

You can also add on any other units you would like to use.

brendanzab commented 8 years ago

Oh cool. I'll start working on the library now if that's ok.

What does Unitless do?

paholg commented 8 years ago

It's the type for something with no units. Say you run

make_units! {
    MS, Unitless, one;
    base {
        Meter, m, m;
        Second, s, s;
    }
}

Then you've created the MS type with units Meter and Second. But these are really aliases, where Meter is MS<P1, Z0> and Second is MS<Z0, P1>. Then, Unitless is MS<Z0, Z0> where P1 is the type for the number 1 and ZO is the type for the number 0.

There are some tutorials for using dimensioned here: http://paholg.com/project/dimensioned/

brendanzab commented 8 years ago

@droundy What do you mean by 'Radians should be dimensionless'? Is what I am saying not possible?

droundy commented 8 years ago

I just mean that radians have no units. It's the name for a dimensionless quantity. In this sense degrees are analogous to dozens or miles, it's a kind of a unit for things that are pure numbers, which don't actually have dimension. This sort of "unit" is tricky, because it is kind of like units, but doesn't work with the same kind of checking that we can use for real dimensions.

Of course, if you don't want to actually do math, you can define angle as a dimension without trouble, and then radians and degrees will both be dimensions. The problem arises, for instance, when you want to find an angle from the ratio of an arc length and a radius, or to write use the first few terms in the Taylor expansion of a trig function. Or if you want to integrate over the surface of a sphere.

On Wed, Dec 2, 2015, 6:30 PM Brendan Zabarauskas notifications@github.com wrote:

@droundy https://github.com/droundy What do you mean by 'Radians should be dimensionless'? Is what I am saying not possible?

— Reply to this email directly or view it on GitHub https://github.com/paholg/dimensioned/issues/5#issuecomment-161466659.

brendanzab commented 8 years ago

Hmm. It is really nice for documentation though, and picks up errors nicely if you mess up. Do you think dimensioned is overkill for this then?

droundy commented 8 years ago

I would find dimensioned to be overkill if all you want is to document that you are taking degrees as input.

On Wed, Dec 2, 2015 at 7:01 PM Brendan Zabarauskas notifications@github.com wrote:

Hmm. It is really nice for documentation though, and picks up errors nicely if you mess up. Do you think dimensioned is overkill for this then?

— Reply to this email directly or view it on GitHub https://github.com/paholg/dimensioned/issues/5#issuecomment-161471725.

paholg commented 8 years ago

I am going to consider this closed. Feel free to re-open it if you have further questions, @bjz.

brendanzab commented 8 years ago

:+1: