# [Python-ideas] Fwd: Trigonometry in degrees

Robert Vanden Eynde robertve92 at gmail.com
Wed Jun 13 06:08:45 EDT 2018

```Then of you also want 45, you could do % 15 ? :D

Le mer. 13 juin 2018 à 12:07, Stephan Houben <stephanh42 at gmail.com> a
écrit :

> 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/e2f9665b/attachment.html>
```

More information about the Python-ideas mailing list