2018-06-13 12:08 GMT+02:00 Robert Vanden Eynde <robertv...@gmail.com>:
> Then of you also want 45, you could do % 15 ? :D > Sure, but how the lookup is done in the Python reference code is ultimately not so important, since it will need to be rewritten in C if it is to be included in the math package (math is C-only). And then we'll probably end up with a bunch of if-checks against the common values. Stephan > > > 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/ > >
_______________________________________________ Python-ideas mailing list Python-ideas@python.org https://mail.python.org/mailman/listinfo/python-ideas Code of Conduct: http://python.org/psf/codeofconduct/