[Python-ideas] Fwd: Trigonometry in degrees

Stephan Houben stephanh42 at gmail.com
Wed Jun 13 07:21:02 EDT 2018


Op wo 13 jun. 2018 13:12 schreef Richard Damon <Richard at damon-family.org>:

> My first comment is that special casing values like this can lead to
> some very undesirable properties when you use the function for numerical
> analysis. Suddenly your sind is no longer continuous (sind(x) is no
> longer the limit of sind(x+d) as d goes to 0).
>


The deviations introduced by the special casing are on the order of one ulp.

At that level of detail the sin wasn't continuous to begin with.

>
> As I stated in my initial comment on this, if you are going to create a
> sind function with the idea that you want 'nice' angles to return
> 'exact' results, then what you need to do is have the degree based trig
> routines do the angle reduction in degrees, and only when you have a
> small enough angle, either use the radians version on the small angle or
> directly include an expansion in degrees.
>


Yes that is what my code does.
It reduces degrees to [0,90].

>
> Angle reduction would be based on the identity that sin(x+y) = sin(x) *
> cos(y) + cos(x) * sin(y) and cos(x+y) = cos(x)*cos(y) - sin(x) * sin(y).
>
> If you want to find sin(z) for an arbitrary value z, you can reduce it
> to and x+y where x is some multiple of say 15 degrees, and y is in the
> range -7.5 to 7.5 degrees. You can have stored exact values of sin/cos
> of the 15 degree increments (and only really need them between 0 and 90)
> and then compute the sin and cos of the y value.


This is not how sine functions are calculated. They are calculated by
reducing angle to some interval, then evaluating a polynomial which
approximates the true sine within that interval.

Stephan


> On 6/13/18 6:07 AM, Stephan Houben wrote:
> > 2018-06-13 12:00 GMT+02:00 Robert Vanden Eynde <robertve92 at gmail.com
> > <mailto:robertve92 at gmail.com>>:
> >
> >     What was wrong with my initial implementation with a lookup table
> >     ? :D
> >
> >     def sind(x):
> >         if x % 90 == 0:
> >             return (0, 1, 0, -1)[int(x // 90) % 4]
> >         else:
> >             return sin(radians(x))
> >
> >
> > I kinda missed it, but now you ask:
> >
> > 1. It's better to reduce the angle while still in degrees since one of
> > the advantages
> >    of degrees is that the reduction can be done exactly. Converting
> > very large angles
> >    first to radians and then taking the sine can introduce a large error,
> >
> > 2. I used fmod instead of % on advice in this thread.
> >
> > 3. I also wanted to special case, 30, 45, and 60.
> >
> >
> >
> >     If you want to support multiples of 30, you can do % 30 and // 30.
> >
> >
> > Sure, but I also wanted to special-case 45.
> >
> > Stephan
> >
> >
> >
> >     Le mer. 13 juin 2018 à 09:51, Stephan Houben <stephanh42 at gmail.com
> >     <mailto:stephanh42 at gmail.com>> a écrit :
> >
> >         Op di 12 jun. 2018 12:41 schreef Nathaniel Smith
> >         <njs at pobox.com <mailto:njs at pobox.com>>:
> >
> >             On Tue, Jun 12, 2018, 00:03 Stephan Houben
> >             <stephanh42 at gmail.com <mailto:stephanh42 at gmail.com>> wrote:
> >
> >                 Hi all,
> >
> >                 I wrote a possible implementation of sindg:
> >
> >
> https://gist.github.com/stephanh42/336d54a53b31104b97e46156c7deacdd
> >                 <
> https://gist.github.com/stephanh42/336d54a53b31104b97e46156c7deacdd>
> >
> >                 This code first reduces the angle to the [0,90] interval.
> >                 After doing so, it can be observed that the simple
> >                 implementation
> >                   math.sin(math.radians(angle))
> >                 produces exact results for 0 and 90, and a result
> >                 already rounded to nearest for
> >                 60.
> >
> >
> >             You observed this on your system, but math.sin uses the
> >             platform libm, which might do different things on other
> >             people's systems.
> >
> >
> >
> >         Ok, I updated the code to treat all the values 0, 30, 45, 60
> >         and 90 specially.
> >
> >         Stephan
> >
> >
> >
> >                 For 30 and 45, this simple implementation is one ulp
> >                 too low.
> >                 So I special-case those to return the
> >                 correct/correctly-rounded value instead.
> >                 Note that this does not affect monotonicity around
> >                 those values.
> >
> >
> >             Again, monotonicity is preserved on your system, but it
> >             might not be on others. It's not clear that this matters,
> >             but then it's not clear that any of this matters...
> >
> >             -n
> >
> >         _______________________________________________
> >         Python-ideas mailing list
> >         Python-ideas at python.org <mailto:Python-ideas at python.org>
> >         https://mail.python.org/mailman/listinfo/python-ideas
> >         <https://mail.python.org/mailman/listinfo/python-ideas>
> >         Code of Conduct: http://python.org/psf/codeofconduct/
> >         <http://python.org/psf/codeofconduct/>
> >
> >
> >     _______________________________________________
> >     Python-ideas mailing list
> >     Python-ideas at python.org <mailto:Python-ideas at python.org>
> >     https://mail.python.org/mailman/listinfo/python-ideas
> >     <https://mail.python.org/mailman/listinfo/python-ideas>
> >     Code of Conduct: http://python.org/psf/codeofconduct/
> >     <http://python.org/psf/codeofconduct/>
> >
> >
> >
> >
> > _______________________________________________
> > Python-ideas mailing list
> > Python-ideas at python.org
> > https://mail.python.org/mailman/listinfo/python-ideas
> > Code of Conduct: http://python.org/psf/codeofconduct/
>
>
> --
> Richard Damon
>
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20180613/fc6dd37b/attachment-0001.html>


More information about the Python-ideas mailing list