Then of you also want 45, you could do % 15 ? :D Le mer. 13 juin 2018 à 12:07, Stephan Houben <stephan...@gmail.com> a écrit :
> 2018-06-13 12:00 GMT+02:00 Robert Vanden Eynde <robertv...@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 <stephan...@gmail.com> a >> écrit : >> >>> Op di 12 jun. 2018 12:41 schreef Nathaniel Smith <n...@pobox.com>: >>> >>>> On Tue, Jun 12, 2018, 00:03 Stephan Houben <stephan...@gmail.com> >>>> wrote: >>>> >>>>> Hi all, >>>>> >>>>> I wrote a possible implementation of sindg: >>>>> >>>>> 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@python.org >>> https://mail.python.org/mailman/listinfo/python-ideas >>> Code of Conduct: http://python.org/psf/codeofconduct/ >>> >> >> _______________________________________________ >> Python-ideas mailing list >> Python-ideas@python.org >> https://mail.python.org/mailman/listinfo/python-ideas >> Code of Conduct: http://python.org/psf/codeofconduct/ >> >> >
_______________________________________________ Python-ideas mailing list Python-ideas@python.org https://mail.python.org/mailman/listinfo/python-ideas Code of Conduct: http://python.org/psf/codeofconduct/