[Python-ideas] Fwd: Trigonometry in degrees

Steven D'Aprano steve at pearwood.info
Mon Jun 11 06:45:24 EDT 2018


On Mon, Jun 11, 2018 at 09:18:22AM +0200, Jacco van Dorp wrote:
> > Remember, because π is irrational, we cannot actually call sin or cos on
> > any rational multiple of π. We can only operate on multiples of pi,
> > which is *close to* but not the same as π. That's why it is okay that
> > tan(pi/2) returns a huge number instead of infinity or NAN. That's
> > because the input is every so slightly smaller than π/2. That's exactly
> > the behaviour you want when x is ever so slightly smaller than π/2.
> 
> 
> This would basically be the reason for a PiMultiple class - you can
> special case it. You'd know sin(PiMultiple(0.5)) == 0.

Not when I went to school it wasn't. sin(π/2) = sin(90°) = 1.

Perhaps you meant cos?

In any case, the sin function doesn't work that way. Unless we add a 
special dunder method to defer to, it cannot be expected to magically 
know how to deal with these "PiMultiple" objects, except by converting 
them to floats.

You don't suddenly get accurate results by waving a magic wand over the 
float 0.5 and saying "You're a multiple of pi". You still have to code a 
separate algorithm for this, and that's hard work. (Why do you think the 
decimal module doesn't support trig functions?)

Is every function that takes float arguments now supposed to recognise 
PiMultiple objects and treat them specially? How do they integrate in 
the numeric tower and interact with ordinary floats?

But let's say you do this:

def sin(arg):
    if isinstance(arg, PiMultiple):
        # does this mean it needs to be a builtin class?
        call internal sinpi(arg) function
    else:
        call regular sin(arg) function

This isn't Java, and not everything needs to be a class. If we go to the 
trouble of writing separate sinpi() etc implementations, why hide one of 
them behind a class (and not even in a proper object-oriented interface) 
when we can just call the functions directly?

    sinpi(1.5)

    sin(PiMultiple(1.5))

I know which I'd rather use.


> It also gives a reason -against- degrees. if you have PiMultiple or
> TauMultiple, it's rather easy to give common angles,

What about the uncommon angles?

The whole point of this proposal is to make it easy to give angles in 
degrees without the need to convert to radians, introducing rounding 
errors over and above those introduced by the trig function itself.


> and students can
> learn to properly learn radians for angles as they should.(because,
> lets be honest, they're objectively better measures of angles than
> degrees, or even *shiver* grads. )

No they are not objectively better measures of angles. With radians, you 
have to divide a right angle into an irrational number of radians, one 
which cannot be expressed in a finite number of decimal places.

In a very real sense, it is impossible to measure exactly 1 radian.

I know that in practical terms, this makes no difference, we can get 
close enough, but physical measurements are limited to rational numbers. 
A measurement system based on irrational numbers, especially one as 
difficult as π, is not objectively better.

Its not just because of tradition that nobody uses radians in civil 
engineering, astronomy, architecture, etc. Radians shine when we're 
doing pure maths and some branches of physics, but they're a PITA to use 
in most practical circumstances.

E,g, the tip of your little finger at arms length is close enough to 1° 
or 0.017 radian. Who wants to measure angles in multiples of 0.017?

https://www.timeanddate.com/astronomy/measuring-the-sky-by-hand.html

Using radians, these heuristics stink.


-- 
Steve



More information about the Python-ideas mailing list