[Python-ideas] Fwd: Trigonometry in degrees

Stephan Houben stephanh42 at gmail.com
Wed Jun 13 06:07:42 EDT 2018


2018-06-13 12:00 GMT+02:00 Robert Vanden Eynde <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> a
> écrit :
>
>> Op di 12 jun. 2018 12:41 schreef Nathaniel Smith <njs at pobox.com>:
>>
>>> On Tue, Jun 12, 2018, 00:03 Stephan Houben <stephanh42 at 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 at python.org
>> https://mail.python.org/mailman/listinfo/python-ideas
>> Code of Conduct: 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/
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20180613/ddd7f0e4/attachment-0001.html>


More information about the Python-ideas mailing list