Numworks Epsilon  1.4.1
Graphing Calculator Operating System
complex.cpp
Go to the documentation of this file.
1 #include <quiz.h>
2 #include <poincare.h>
3 #include <string.h>
4 #include <ion.h>
5 #include <stdlib.h>
6 #include <assert.h>
7 #include <cmath>
8 #include "helper.h"
9 
10 using namespace Poincare;
11 
12 QUIZ_CASE(poincare_complex_evaluate) {
13  GlobalContext globalContext;
14  Expression * a = new Complex<float>(Complex<float>::Float(123.456f));
15  Expression * m = a->approximate<double>(globalContext);
17  Complex<double> * mc = static_cast<Complex<double> *>(m);
18  assert(std::fabs(mc->a() - 123.456) < 0.00001);
19  assert(mc->b() == 0.0);
20  delete m;
21 
22  Expression * n = a->approximate<float>(globalContext);
24  Complex<float> * nc = static_cast<Complex<float> *>(n);
25  assert(nc->a() == 123.456f);
26  assert(nc->b() == 0.0f);
27  delete n;
28 
29  delete a;
30 }
31 
32 QUIZ_CASE(poincare_complex_constructor) {
34  assert(std::fabs(a->a() - 2.0f) < 0.00001f && std::fabs(a->b()-3.0f) < 0.00001f);
35  assert(a->r() == 3.60555124f && a->th() == 0.982793748f);
36  delete a;
37 
38  a = new Complex<float>(Complex<float>::Polar(3.60555124f, 0.982793748f));
39  assert(std::fabs(a->a() - 2.0f) < 0.00001f && std::fabs(a->b()-3.0f) < 0.00001f);
40  delete a;
41 
43  assert(std::fabs(b->a() - 1.0) < 0.0000000001 && std::fabs(b->b()-12.0) < 0.0000000001);
44  delete b;
45 
46  b = new Complex<double>(Complex<double>::Polar(12.04159457879229548012824103, 1.4876550949));
47  assert(std::fabs(b->a() - 1.0) < 0.0000000001 && std::fabs(b->b()-12.0) < 0.0000000001);
48  delete b;
49 
50  Complex<float> * c = new Complex<float>(Complex<float>::Cartesian(-2.0e20f, 2.0e20f));
51  assert(c->a() == -2.0e20f && c->b() == 2.0e20f);
52  assert(c->r() == 2.0e20f*(float)M_SQRT2 && c->th() == 3*(float)M_PI_4);
53  delete c;
54 
55  Complex<double> * d = new Complex<double>(Complex<double>::Cartesian(1.0e155, -1.0e155));
56  assert(d->a() == 1.0e155 && d->b() == -1.0e155);
57  assert(d->r() == 1.0e155*M_SQRT2 && d->th() == -M_PI_4);
58  delete d;
59 }
60 
61 QUIZ_CASE(poincare_complex_simplify) {
63  assert_parsed_expression_simplify_to("R(-33)", "R(33)*I");
64  assert_parsed_expression_simplify_to("I^(3/5)", "(R(2)*R(5-R(5))+I+R(5)*I)/4");
66  assert_parsed_expression_simplify_to("R(-I)", "R(-I)");
67  assert_parsed_expression_simplify_to("Acos(9)IIln(2)", "-cos(9)*ln(2)*A");
68  assert_parsed_expression_simplify_to("(R(2)+R(2)*I)/2(R(2)+R(2)*I)/2(R(2)+R(2)*I)/2", "(R(2)-R(2)*I)/32");
69  assert_parsed_expression_simplify_to("root(5^(-I)3^9,I)", "undef");
71 }
T th() const
Definition: complex.cpp:145
#define M_PI_4
Definition: math.h:19
Expression::Type type() const override
Definition: complex.cpp:163
static Complex< T > Cartesian(T a, T b)
Definition: complex.cpp:28
#define assert(e)
Definition: assert.h:9
Expression * approximate(Context &context, AngleUnit angleUnit=AngleUnit::Default) const
Definition: expression.cpp:338
T a() const
Definition: complex.cpp:99
static Complex< T > Polar(T r, T theta)
Definition: complex.cpp:33
QUIZ_CASE(poincare_complex_evaluate)
Definition: complex.cpp:12
#define fabs(x)
Definition: math.h:178
c(generic_all_nodes)
void assert_parsed_expression_simplify_to(const char *expression, const char *simplifiedExpression, Expression::AngleUnit angleUnit)
Definition: helper.cpp:90
static Complex< T > Float(T x)
Definition: complex.cpp:23
virtual Type type() const =0
#define M_SQRT2
Definition: math.h:23