From 4d9e8c40b83f4a66b854d0b5bef4d5acfbb2696a Mon Sep 17 00:00:00 2001 From: Jacob Young Date: Fri, 8 Sep 2017 22:11:27 -0400 Subject: [PATCH] Fix #102. --- liba/include/math.h | 1 + poincare/src/power.cpp | 28 +++++++++++++++------------- poincare/test/power.cpp | 4 ++++ 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/liba/include/math.h b/liba/include/math.h index 1ecbd2249..d0dedff0f 100644 --- a/liba/include/math.h +++ b/liba/include/math.h @@ -10,6 +10,7 @@ LIBA_BEGIN_DECLS #define INFINITY __builtin_inff() #define M_E 2.71828182845904523536028747135266250 #define M_PI 3.14159265358979323846264338327950288 +#define M_PI_2 1.57079632679489661923132169163975144 #define M_PI_4 0.78539816339744830961566084581987572 #define M_SQRT2 1.41421356237309504880168872420969808 diff --git a/poincare/src/power.cpp b/poincare/src/power.cpp index c2a211cbe..1a8002bb1 100644 --- a/poincare/src/power.cpp +++ b/poincare/src/power.cpp @@ -34,19 +34,19 @@ ExpressionLayout * Power::privateCreateLayout(FloatDisplayMode floatDisplayMode, template Complex Power::compute(const Complex c, const Complex d) { - if (d.b() != 0) { - /* First case c and d is complex */ - if (c.b() != 0 || c.a() <= 0) { - return Complex::Float(NAN); - } - /* Second case only d is complex */ - T radius = std::pow(c.a(), d.a()); - T theta = d.b()*std::log(c.a()); - return Complex::Polar(radius, theta); - } - /* Third case only c is complex */ - T radius = std::pow(c.r(), d.a()); - T theta = d.a()*c.th(); + // c == c.r * e^(c.th*i) + // d == d.a + d.b*i + // c^d == e^(ln(c^d)) + // == e^(ln(c) * d) + // == e^(ln(c.r * e^(c.th*i)) * (d.a + d.b*i)) + // == e^((ln(c.r) + ln(e^(c.th*i))) * (d.a + d.b*i)) + // == e^((ln(c.r) + c.th*i) * (d.a + d.b*i)) + // == e^(ln(c.r)*d.a + ln(c.r)*d.b*i + c.th*i*d.a + c.th*i*d.b*i) + // == e^((ln(c.r^d.a) + ln(e^(c.th*d.b*i^2))) + (ln(c.r)*d.b + c.th*d.a)*i) + // == e^(ln(c.r^d.a * e^(-c.th*d.b))) * e^((ln(c.r)*d.b + c.th*d.a)*i) + // == c.r^d.a*e^(-c.th*d.b) * e^((ln(c.r)*d.b + c.th*d.a)*i) + T radius = std::pow(c.r(), d.a()) * std::exp(-c.th() * d.b()); + T theta = std::log(c.r())*d.b() + c.th()*d.a(); return Complex::Polar(radius, theta); } @@ -86,4 +86,6 @@ template Evaluation * Power::templatedComputeOnComplexMatrices(Ev return new Complex(Complex::Float(NAN)); } +template Complex Power::compute(Complex, Complex); +template Complex Power::compute(Complex, Complex); } diff --git a/poincare/test/power.cpp b/poincare/test/power.cpp index dda6d8f08..d8d875c8e 100644 --- a/poincare/test/power.cpp +++ b/poincare/test/power.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include "helper.h" using namespace Poincare; @@ -23,4 +24,7 @@ QUIZ_CASE(poincare_power_evaluate) { Complex e[1] = {Complex::Float(0.0f)}; assert_parsed_expression_evaluates_to("0^2", e); + + Complex f[1] = {Complex::Float(std::exp(-M_PI_2))}; + assert_parsed_expression_evaluates_to("I^I", f); }