[Python-ideas] Fwd: Trigonometry in degrees

Clément Pit-Claudel cpitclaudel at gmail.com
Mon Jun 11 15:50:01 EDT 2018


On 2018-06-11 14:04, Stephan Houben wrote:
> 2018-06-11 19:33 GMT+02:00 Michael Selik <mike at selik.org <mailto:mike at selik.org>>:
> 
>     Whoops, it turns out Euler's formula does work! I expected imprecision, but at least one test matched.
> 
>     x = 42
>     cos(x) + 1j * sin(x) == e ** (1j * x)
> 
> 
> I think you will find it holds for any x (except inf, -inf and nan).
> The boat is less leaky than you think; IEEE floating-point arithmetic goes
> out of its way to produce exact answers whenever possible.
> (To great consternation of hardware designers who felt that
> requiring 1.0*x == x was too expensive.)

In fact, 1.0*x == x is almost all that this test exercises.  If I'm looking in the right place, this is C the implementation of a ** b, omitting in a few special cases:

        vabs = hypot(a.real,a.imag);
        len = pow(vabs,b.real);
        at = atan2(a.imag, a.real);
        phase = at*b.real;
        if (b.imag != 0.0) {
            len /= exp(at*b.imag);
            phase += b.imag*log(vabs);
        }
        r.real = len*cos(phase);
        r.imag = len*sin(phase);

This means that (e ** ...) is essentially implemented in terms of the formula above.  Indeed, in the special case of e ** (1j * x), we have a.real = e, a.imag = 0.0, b.real = 0.0, and b.imag = 1.0, so concretely the code simplifies to this:

        vabs = e
        len = 1.0
        at = 0.0
        phase = 0.0
        if (b.imag != 0.0) {
            len = 1.0;
            phase = x; // requires log(e) == 1.0 and x * 1.0 == x
        }
        r.real = cos(phase); // requires 1.0 * x == x
        r.imag = sin(phase);

Thus, it shouldn't be too surprising that the formula holds :)

Clément.


More information about the Python-ideas mailing list