#include #include #include #include #include #include #include extern "C" { #include } #include namespace Poincare { constexpr Expression::FunctionHelper ComplexArgument::s_functionHelper; int ComplexArgumentNode::numberOfChildren() const { return ComplexArgument::s_functionHelper.numberOfChildren(); } Layout ComplexArgumentNode::createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const { return LayoutHelper::Prefix(ComplexArgument(this), floatDisplayMode, numberOfSignificantDigits, ComplexArgument::s_functionHelper.name()); } int ComplexArgumentNode::serialize(char * buffer, int bufferSize, Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const { return SerializationHelper::Prefix(this, buffer, bufferSize, floatDisplayMode, numberOfSignificantDigits, ComplexArgument::s_functionHelper.name()); } Expression ComplexArgumentNode::shallowReduce(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ReductionTarget target, bool symbolicComputation) { return ComplexArgument(this).shallowReduce(context, complexFormat, angleUnit, target); } template Complex ComplexArgumentNode::computeOnComplex(const std::complex c, Preferences::ComplexFormat, Preferences::AngleUnit angleUnit) { return Complex::Builder(std::arg(c)); } Expression ComplexArgument::shallowReduce(Context & context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, ExpressionNode::ReductionTarget target) { { Expression e = Expression::defaultShallowReduce(); if (e.isUndefined()) { return e; } } Expression c = childAtIndex(0); #if MATRIX_EXACT_REDUCING if (c.type() == ExpressionNode::Type::Matrix) { return SimplificationHelper::Map(*this, context, angleUnit); } #endif bool real = c.isReal(context); if (real) { float app = c.node()->approximate(float(), context, complexFormat, angleUnit).toScalar(); if (!std::isnan(app) && app >= Expression::Epsilon()) { // arg(x) = 0 if x > 0 Expression result = Rational::Builder(0); replaceWithInPlace(result); return result; } else if (!std::isnan(app) && app <= -Expression::Epsilon()) { // arg(x) = Pi if x < 0 Expression result = Constant::Builder(UCodePointGreekSmallLetterPi); replaceWithInPlace(result); return result; } } if (real || c.type() == ExpressionNode::Type::ComplexCartesian) { ComplexCartesian complexChild = real ? ComplexCartesian::Builder(c, Rational::Builder(0)) : static_cast(c); Expression childArg = complexChild.argument(context, complexFormat, angleUnit, target); replaceWithInPlace(childArg); return childArg.shallowReduce(context, complexFormat, angleUnit, target); } return *this; } }