[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