Hacker News new | ask | show | jobs
by jskherman 948 days ago
How does Numbat infer the type/unit for operations that involve transcendental functions like the trigonometric functions and the natural logarithm? How about for exponents that are not integers (rational or irrational)?

I've seen from to time some empirical equations that result to this. Usually, it's just hand-waved away and the non-integer units are ignored or dropped when the transcendental function is evaluated. I guess the trivial answer is probably add an extra factor with a value of 1 with the reciprocal units to result to the said type 1 for dimensionless units?

1 comments

Those types of functions are only allowed to take in dimensionless (ie scalar) values. Numbat seems to handle this correctly, see [1].

[1]: https://numbat.dev

I guess that's logical, still a bit tedious in converting values to scalars...
To be fair, thse functions aren't defined for physical quantities.

As a physicist, if you ever see units on the parameter to a trigonmetric function, you can be fairly certain something is wrong.

You can derive this from how e.g. cos(x) can be written as a polynomial series, something like 1 - x^2 + whatever; and since 1 and x^2 would have different units if x is anything but unitless, you've goofed.

That's a big reason why units are used in calculations in the first place. They basically act as a sort of checksum for your calculations.

> As a physicist, if you ever see units on the parameter to a trigonmetric function, you can be fairly certain something is wrong.

Exactly. Which is why trigonometric functions in Numbat have the signature

  cos(x: Scalar) -> Scalar
and only take quantities as arguments that are implicitly convertible to a scalar, like 'cos(pi / 3)', 'cos(30 deg)' or 'cos(0.5 turn)'.

Whether or not angles should be considered dimensionless is actually a matter of academic dispute. If you want to know more, take a look at https://github.com/sharkdp/numbat/pull/167 and the references therein.

Radians vs degrees?
For radians, we can note that the length of a circle segment is rα, where r is the radius and α is the angle, where both the radius and circle segment have dimensions length; then we must infer that α is dimensionless.

Degrees follow a similar argument.

Radians, gradians, degrees, minutes, seconds, thirds, revolutions are all ways of dividing up a circle
If the value passed to the function isn't dimensionless there's very likely a unit error somewhere.

I can't come up with an example where that would be a reasonable thing to do, but haven't thought too much about it.

You don't have to convert to scalars. Numbers have a type of 1 (= Scalar).

You can just call exp(3), for example: https://numbat.dev/?q=exp%283%29%E2%8F%8E

Or you could pass an angle quantity, which is convertible to a Scalar. Like cos(30 deg): https://numbat.dev/?q=exp%283%29%E2%8F%8Ecos%2830+deg%29%E2%...

If you find yourself wanting to do that, you're probably making the exact kind of error that the language is meant to prevent.