#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(ReductionContext reductionContext) { return ComplexArgument(this).shallowReduce(reductionContext); } template Complex ComplexArgumentNode::computeOnComplex(const std::complex c, Preferences::ComplexFormat, Preferences::AngleUnit angleUnit) { return Complex::Builder(std::arg(c)); } Expression ComplexArgument::shallowReduce(ExpressionNode::ReductionContext reductionContext) { { Expression e = Expression::defaultShallowReduce(); e = e.defaultHandleUnitsInChildren(); if (e.isUndefined()) { return e; } } Expression c = childAtIndex(0); if (c.type() == ExpressionNode::Type::Matrix) { return mapOnMatrixFirstChild(reductionContext); } if (c.deepIsMatrix(reductionContext.context())) { return *this; } bool real = c.isReal(reductionContext.context()); if (real) { float app = c.node()->approximate(float(), ExpressionNode::ApproximationContext(reductionContext, true)).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(reductionContext); replaceWithInPlace(childArg); return childArg.shallowReduce(reductionContext); } return *this; } }