[Python-ideas] Fwd: Trigonometry in degrees

Stephan Houben stephanh42 at gmail.com
Wed Jun 13 06:20:34 EDT 2018


2018-06-13 12:08 GMT+02:00 Robert Vanden Eynde <robertve92 at 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 <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/
>>>
>>>
>>
> _______________________________________________
> 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/277aa181/attachment-0001.html>


More information about the Python-ideas mailing list