[Python-ideas] Fwd: Trigonometry in degrees

Steven D'Aprano steve at pearwood.info
Mon Jun 11 01:48:31 EDT 2018

On Sun, Jun 10, 2018 at 10:01:09PM -0700, Chris Barker via Python-ideas wrote:

> In regard to the "special values", and exact results -- a good math lib
> should return results that are "exact" in all but maybe the last digit
> stored. So you could check inputs and outputs with, e.g. math.isclose() to
> give people the "exact" results. -- and keep it all in floating point.

I wish Uncle Timmy or Mark Dickinson were around to give a definite 
answer, but in their absence I'll have a go. I'm reasonably sure 
that's wrong.

The problem with trig functions is that they suffer from "the 
table maker's dilemma", so it is very hard to guarantee a correctly 
rounded result without going to ludicrous extremes:


So I think that there's no guarantee given for trancendental functions 
like sine, cosine etc.

But even if they were, using isclose() is the wrong solution. Suppose 
sin(x) returns some number y, such that isclose(y, 0.0) say. You have no 
way of knowing that y is an inaccurate result that ought to be zero, or 
whether the answer should be non-zero and y is correct. You cannot 
assume that "y is close to zero, therefore it ought to be zero".

It's not just zero, the same applies for any value. That's just moving 
rounding errors from one input to a slightly different input.

# current situation
sine of x returns y, but the mathematical exact result is exactly z

# suggested "fix"
sine of x ± a tiny bit returns exactly z, but ought to return y

Guessing what sin or cos "ought to" return based on either the inexact 
input or inexact output is not a good approach.

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.


More information about the Python-ideas mailing list