[poincare] Undefined::Name() gives "undef"

This commit is contained in:
Léa Saviot
2018-11-19 11:04:54 +01:00
committed by Émilie Feral
parent 1cb9d5445c
commit 63e83c246b
20 changed files with 98 additions and 96 deletions

View File

@@ -144,7 +144,7 @@ bool Calculation::shouldOnlyDisplayApproximateOutput(Context * context) {
if (strcmp(m_exactOutputText, m_approximateOutputText) == 0) {
return true;
}
if (strcmp(m_exactOutputText, "undef") == 0) {
if (strcmp(m_exactOutputText, Undefined::Name()) == 0) {
return true;
}
return input().isApproximate(*context) || exactOutput().isApproximate(*context);
@@ -155,7 +155,7 @@ bool Calculation::shouldOnlyDisplayExactOutput() {
* This prevents:
* x->f(x) from displaying x = undef
* x+x form displaying 2x = undef */
if (strcmp(m_approximateOutputText, "undef") == 0) {
if (strcmp(m_approximateOutputText, Undefined::Name()) == 0) {
return true;
}
}

View File

@@ -39,6 +39,12 @@ private:
class Undefined final : public Number {
public:
Undefined() : Number(TreePool::sharedPool()->createTreeNode<UndefinedNode>()) {}
static const char * Name() {
return "undef";
}
static int NameSize() {
return 6;
}
};
}

View File

@@ -2,6 +2,7 @@
#include <poincare/rational.h>
#include <poincare/opposite.h>
#include <poincare/infinity.h>
#include <poincare/undefined.h>
#include <poincare/layout_helper.h>
#include <poincare/ieee754.h>
#include <assert.h>
@@ -140,7 +141,7 @@ int DecimalNode::convertToText(char * buffer, int bufferSize, Preferences::Print
}
int mantissaLength = m.serialize(tempBuffer, PrintFloat::k_numberOfStoredSignificantDigits+1);
assert(strcmp(tempBuffer, "inf") != 0 && strcmp(tempBuffer, "-inf") != 0);
if (strcmp(tempBuffer, "undef") == 0) {
if (strcmp(tempBuffer, Undefined::Name()) == 0) {
currentChar += strlcpy(buffer+currentChar, tempBuffer, bufferSize-currentChar);
return currentChar;
}

View File

@@ -37,14 +37,14 @@ bool Parser::IsReservedFunctionName(const char * name, size_t nameLength, const
bool Parser::IsSpecialIdentifierName(const char * name, size_t nameLength) {
// TODO Avoid special cases if possible
return (
Token::CompareNonNullTerminatedName(name, nameLength, Symbol::k_ans) == 0 ||
Token::CompareNonNullTerminatedName(name, nameLength, "inf") == 0 ||
Token::CompareNonNullTerminatedName(name, nameLength, "undef") == 0 ||
Token::CompareNonNullTerminatedName(name, nameLength, "u_") == 0 ||
Token::CompareNonNullTerminatedName(name, nameLength, "v_") == 0 ||
Token::CompareNonNullTerminatedName(name, nameLength, "u") == 0 ||
Token::CompareNonNullTerminatedName(name, nameLength, "v") == 0 ||
Token::CompareNonNullTerminatedName(name, nameLength, "log_") == 0
Token::CompareNonNullTerminatedName(name, nameLength, Symbol::k_ans) == 0 ||
Token::CompareNonNullTerminatedName(name, nameLength, "inf") == 0 ||
Token::CompareNonNullTerminatedName(name, nameLength, Undefined::Name()) == 0 ||
Token::CompareNonNullTerminatedName(name, nameLength, "u_") == 0 ||
Token::CompareNonNullTerminatedName(name, nameLength, "v_") == 0 ||
Token::CompareNonNullTerminatedName(name, nameLength, "u") == 0 ||
Token::CompareNonNullTerminatedName(name, nameLength, "v") == 0 ||
Token::CompareNonNullTerminatedName(name, nameLength, "log_") == 0
);
}
@@ -349,7 +349,7 @@ void Parser::parseSpecialIdentifier(Expression & leftHandSide) {
leftHandSide = Symbol::Ans();
} else if (m_currentToken.compareTo("inf") == 0) {
leftHandSide = Infinity(false);
} else if (m_currentToken.compareTo("undef") == 0) {
} else if (m_currentToken.compareTo(Undefined::Name()) == 0) {
leftHandSide = Undefined();
} else if (m_currentToken.compareTo("u_") == 0 || m_currentToken.compareTo("v_") == 0) { // Special case for sequences (e.g. "u_{n}")
parseSequence(leftHandSide, m_currentToken.text()[0], Token::LeftBrace, Token::RightBrace);

View File

@@ -2,6 +2,7 @@
#include <poincare/preferences.h>
#include <poincare/ieee754.h>
#include <poincare/integer.h>
#include <poincare/undefined.h>
extern "C" {
#include <assert.h>
#include <stdlib.h>
@@ -79,14 +80,9 @@ int PrintFloat::convertFloatToTextPrivate(T f, char * buffer, int numberOfSignif
}
if (std::isinf(f) || std::isnan(f)) {
int currentChar = 0;
buffer[currentChar++] = 'u';
buffer[currentChar++] = 'n';
buffer[currentChar++] = 'd';
buffer[currentChar++] = 'e';
buffer[currentChar++] = 'f';
buffer[currentChar] = 0;
return currentChar;
assert(Undefined::NameSize() < PrintFloat::k_maxFloatBufferLength);
strlcpy(buffer, Undefined::Name(), PrintFloat::k_maxFloatBufferLength);
return Undefined::NameSize() - 1;
}
int exponentInBase10 = IEEE754<T>::exponentBase10(f);

View File

@@ -18,16 +18,15 @@ Expression UndefinedNode::setSign(Sign s, Context & context, Preferences::AngleU
}
Layout UndefinedNode::createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const {
char buffer[6];
int numberOfChars = PrintFloat::convertFloatToText<float>(NAN, buffer, 6, numberOfSignificantDigits, floatDisplayMode);
return LayoutHelper::String(buffer, numberOfChars);
return LayoutHelper::String(Undefined::Name(), Undefined::NameSize());
}
int UndefinedNode::serialize(char * buffer, int bufferSize, Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const {
if (bufferSize == 0) {
return -1;
}
return PrintFloat::convertFloatToText<float>(NAN, buffer, bufferSize, numberOfSignificantDigits, floatDisplayMode);
strlcpy(buffer, Undefined::Name(), bufferSize);
return min(Undefined::NameSize(), bufferSize) - 1;
}
template<typename T> Evaluation<T> UndefinedNode::templatedApproximate() const {

View File

@@ -75,12 +75,12 @@ QUIZ_CASE(poincare_complex_to_expression) {
assert_parsed_expression_evaluates_to<double>("1E155-1E155*I", "1E155-1E155*I");
assert_parsed_expression_evaluates_to<double>("1E155-1E155*I", "1.41421356237E155*X^(-0.785398163397*I)", Radian, Polar,12);
assert_parsed_expression_evaluates_to<float>("-2E100+2E100*I", "undef");
assert_parsed_expression_evaluates_to<double>("-2E360+2E360*I", "undef");
assert_parsed_expression_evaluates_to<float>("-2E100+2E100*I", Undefined::Name());
assert_parsed_expression_evaluates_to<double>("-2E360+2E360*I", Undefined::Name());
assert_parsed_expression_evaluates_to<float>("-2E100+2E10*I", "(-inf)+2E10*I");
assert_parsed_expression_evaluates_to<double>("-2E360+2*I", "(-inf)+2*I");
assert_parsed_expression_evaluates_to<float>("undef+2E100*I", "undef");
assert_parsed_expression_evaluates_to<double>("-2E360+undef*I", "undef");
assert_parsed_expression_evaluates_to<float>("undef+2E100*I", Undefined::Name());
assert_parsed_expression_evaluates_to<double>("-2E360+undef*I", Undefined::Name());
assert_parsed_expression_evaluates_to<double>("2*X^(I)", "2*X^I", Radian, Polar, 5);
assert_parsed_expression_evaluates_to<double>("2*X^(-I)", "2*X^(-I)", Radian, Polar, 5);

View File

@@ -283,6 +283,6 @@ QUIZ_CASE(poincare_approximation_to_text) {
assert_expression_prints_to(Float<double>(INFINITY), "inf", DecimalMode);
assert_expression_prints_to(Float<float>(0.0f), "0", DecimalMode);
assert_expression_prints_to(Float<float>(NAN), "undef", DecimalMode);
assert_expression_prints_to(Float<float>(NAN), Undefined::Name(), DecimalMode);
}

View File

@@ -8,7 +8,7 @@ using namespace Poincare;
QUIZ_CASE(poincare_factorial_simplify) {
assert_parsed_expression_simplify_to("1/3!", "1/6");
assert_parsed_expression_simplify_to("5!", "120");
assert_parsed_expression_simplify_to("(1/3)!", "undef");
assert_parsed_expression_simplify_to("P!", "undef");
assert_parsed_expression_simplify_to("X!", "undef");
assert_parsed_expression_simplify_to("(1/3)!", Undefined::Name());
assert_parsed_expression_simplify_to("P!", Undefined::Name());
assert_parsed_expression_simplify_to("X!", Undefined::Name());
}

View File

@@ -42,6 +42,6 @@ QUIZ_CASE(poincare_float_evaluate) {
assert_float_evaluates_to<double>(Float<double>(INFINITY), "inf");
assert_float_evaluates_to<float>(Float<float>(0.0f), "0");
assert_float_evaluates_to<float>(Float<float>(NAN), "undef");
assert_float_evaluates_to<float>(Float<float>(NAN), Undefined::Name());
}

View File

@@ -247,7 +247,7 @@ QUIZ_CASE(poincare_function_simplify) {
assert_parsed_expression_simplify_to("factor(-10008/6895)", "-(2^3*3^2*139)/(5*7*197)");
assert_parsed_expression_simplify_to("factor(1008/6895)", "(2^4*3^2)/(5*197)");
assert_parsed_expression_simplify_to("factor(10007)", "10007");
assert_parsed_expression_simplify_to("factor(10007^2)", "undef");
assert_parsed_expression_simplify_to("factor(10007^2)", Undefined::Name());
assert_parsed_expression_simplify_to("floor(-1.3)", "-2");
assert_parsed_expression_simplify_to("frac(-1.3)", "7/10");
assert_parsed_expression_simplify_to("gcd(123,278)", "1");
@@ -264,6 +264,6 @@ QUIZ_CASE(poincare_function_simplify) {
assert_parsed_expression_simplify_to("round(12.9,-1)", "10");
assert_parsed_expression_simplify_to("round(12.9,-2)", "0");
assert_parsed_expression_simplify_to("permute(99,4)", "90345024");
assert_parsed_expression_simplify_to("permute(20,-10)", "undef");
assert_parsed_expression_simplify_to("permute(20,-10)", Undefined::Name());
assert_parsed_expression_simplify_to("re(1/2)", "1/2");
}

View File

@@ -14,7 +14,7 @@ QUIZ_CASE(poincare_logarithm_evaluate) {
assert_parsed_expression_evaluates_to<double>("log(6,7+4*I)", "8.0843880717528E-1-2.0108238082167E-1*I");
assert_parsed_expression_evaluates_to<float>("log(5+2*I)", "0.731199+0.1652518*I");
assert_parsed_expression_evaluates_to<double>("ln(5+2*I)", "1.6836479149932+3.8050637711236E-1*I");
assert_parsed_expression_evaluates_to<double>("log(0,0)", "undef");
assert_parsed_expression_evaluates_to<double>("log(0,0)", Undefined::Name());
assert_parsed_expression_evaluates_to<double>("log(0)", "-inf");
assert_parsed_expression_evaluates_to<double>("log(2,0)", "0");
@@ -23,15 +23,15 @@ QUIZ_CASE(poincare_logarithm_evaluate) {
}
QUIZ_CASE(poincare_logarithm_simplify) {
assert_parsed_expression_simplify_to("log(0,0)", "undef");
assert_parsed_expression_simplify_to("log(0,1)", "undef");
assert_parsed_expression_simplify_to("log(0,0)", Undefined::Name());
assert_parsed_expression_simplify_to("log(0,1)", Undefined::Name());
assert_parsed_expression_simplify_to("log(1,0)", "0");
assert_parsed_expression_simplify_to("log(2,0)", "0");
assert_parsed_expression_simplify_to("log(0,14)", "-inf");
assert_parsed_expression_simplify_to("log(0,0.14)", "inf");
assert_parsed_expression_simplify_to("log(0,0.14+I)", "undef");
assert_parsed_expression_simplify_to("log(2,1)", "undef");
assert_parsed_expression_simplify_to("log(x,1)", "undef");
assert_parsed_expression_simplify_to("log(0,0.14+I)", Undefined::Name());
assert_parsed_expression_simplify_to("log(2,1)", Undefined::Name());
assert_parsed_expression_simplify_to("log(x,1)", Undefined::Name());
assert_parsed_expression_simplify_to("log(12925)", "2*log(5)+log(11)+log(47)");
assert_parsed_expression_simplify_to("ln(12925)", "2*ln(5)+ln(11)+ln(47)");
assert_parsed_expression_simplify_to("log(1742279/12925, 6)", "(-2*log(5,6))+log(7,6)+3*log(11,6)+log(17,6)-log(47,6)");

View File

@@ -17,7 +17,7 @@ QUIZ_CASE(poincare_matrix_simplify) {
// Addition Matrix
assert_parsed_expression_simplify_to("1+[[1,2,3][4,5,6]]", "[[2,3,4][5,6,7]]");
assert_parsed_expression_simplify_to("[[1,2,3][4,5,6]]+1", "[[2,3,4][5,6,7]]");
assert_parsed_expression_simplify_to("[[1,2][3,4]]+[[1,2,3][4,5,6]]", "undef");
assert_parsed_expression_simplify_to("[[1,2][3,4]]+[[1,2,3][4,5,6]]", Undefined::Name());
assert_parsed_expression_simplify_to("[[1,2,3][4,5,6]]+[[1,2,3][4,5,6]]", "[[2,4,6][8,10,12]]");
assert_parsed_expression_simplify_to("2+[[1,2,3][4,5,6]]+[[1,2,3][4,5,6]]", "[[4,6,8][10,12,14]]");
assert_parsed_expression_simplify_to("[[1,2,3][4,5,6]]+cos(2)+[[1,2,3][4,5,6]]", "[[2+cos(2),4+cos(2),6+cos(2)][8+cos(2),10+cos(2),12+cos(2)]]");
@@ -32,14 +32,14 @@ QUIZ_CASE(poincare_matrix_simplify) {
assert_parsed_expression_simplify_to("[[1,2,3][4,5,6]]*R(2)", "[[R(2),2R(2),3R(2)][4R(2),5R(2),6R(2)]]");
assert_parsed_expression_simplify_to("[[1,2][3,4]]*[[1,2,3][4,5,6]]", "[[9, 12, 15][19, 26, 33]]");
assert_parsed_expression_simplify_to("[[1,2,3][4,5,6]]*[[1,2][2,3][5,6]]", "[[20, 26][44, 59]]");
assert_parsed_expression_simplify_to("[[1,2,3,4][4,5,6,5]]*[[1,2][2,3][5,6]]", "undef");
assert_parsed_expression_simplify_to("[[1,2,3,4][4,5,6,5]]*[[1,2][2,3][5,6]]", Undefined::Name());
assert_parsed_expression_simplify_to("[[1,2][3,4]]^(-3)*[[1,2][3,4]]", "[[1,2][3,4]]^(-3)*[[1,2][3,4]]");
assert_parsed_expression_simplify_to("[[1,2][3,4]]^(-3)*[[1,2,3][3,4,5]]*[[1,2][3,2][4,5]]*4", "[[37,54][81,118]]^(-1)*[[76,84][140,156]]");
assert_parsed_expression_simplify_to("[[1,2][3,4]]^(-3)*[[1,2][3,4]]", "[[1,2][3,4]]^(-3)*[[1,2][3,4]]");
// Power Matrix
assert_parsed_expression_simplify_to("[[1,2,3][4,5,6][7,8,9]]^3", "[[468,576,684][1062,1305,1548][1656,2034,2412]]");
assert_parsed_expression_simplify_to("[[1,2,3][4,5,6]]^(-1)", "undef");
assert_parsed_expression_simplify_to("[[1,2,3][4,5,6]]^(-1)", Undefined::Name());
assert_parsed_expression_simplify_to("[[1,2][3,4]]^(-1)", "[[1,2][3,4]]^(-1)"); // TODO: Implement matrix inverse for dim < 3
// Function on matrix
@@ -48,23 +48,23 @@ QUIZ_CASE(poincare_matrix_simplify) {
assert_parsed_expression_simplify_to("asin([[1/R(2),1/2][1,-1]])", "[[P/4,P/6][P/2,-P/2]]");
assert_parsed_expression_simplify_to("atan([[R(3),1][1/R(3),-1]])", "[[P/3,P/4][P/6,-P/4]]");
assert_parsed_expression_simplify_to("acos([[1/R(2),1/2][1,-1]])", "[[P/4,P/3][0,P]]");
assert_parsed_expression_simplify_to("binomial([[1,-2][3,4]], 2)", "undef");
assert_parsed_expression_simplify_to("binomial([[1,-2][3,4]], 2)", Undefined::Name());
assert_parsed_expression_simplify_to("ceil([[1/R(2),1/2][1,-1.3]])", "[[ceil(R(2)/2),1][1,-1]]");
assert_parsed_expression_simplify_to("confidence(1/3, 25)", "[[2/15,8/15]]");
assert_parsed_expression_simplify_to("confidence(45, 25)", "undef");
assert_parsed_expression_simplify_to("confidence(1/3, -34)", "undef");
assert_parsed_expression_simplify_to("confidence(45, 25)", Undefined::Name());
assert_parsed_expression_simplify_to("confidence(1/3, -34)", Undefined::Name());
assert_parsed_expression_simplify_to("conj([[1/R(2),1/2][1,-1]])", "[[conj(1/R(2)),1/2][1,-1]]");
assert_parsed_expression_simplify_to("cos([[P/3,0][P/7,P/2]])", "[[1/2,1][cos(P/7),0]]");
assert_parsed_expression_simplify_to("diff([[P/3,0][P/7,P/2]],x,3)", "undef");
assert_parsed_expression_simplify_to("diff([[P/3,0][P/7,P/2]],x,3)", Undefined::Name());
assert_parsed_expression_simplify_to("det([[1,2][3,4]])", "det([[1,2][3,4]])"); // TODO: implement determinant if dim < 3
assert_parsed_expression_simplify_to("det([[2,2][3,4]])", "det([[2,2][3,4]])");
assert_parsed_expression_simplify_to("det([[2,2][3,3]])", "det([[2,2][3,3]])");
assert_parsed_expression_simplify_to("quo([[2,2][3,3]],2)", "undef");
assert_parsed_expression_simplify_to("rem([[2,2][3,3]],2)", "undef");
assert_parsed_expression_simplify_to("quo([[2,2][3,3]],2)", Undefined::Name());
assert_parsed_expression_simplify_to("rem([[2,2][3,3]],2)", Undefined::Name());
assert_parsed_expression_simplify_to("[[1,2][3,4]]!", "[[1,2][6,24]]");
assert_parsed_expression_simplify_to("floor([[1/R(2),1/2][1,-1.3]])", "[[floor(R(2)/2),0][1,-2]]");
assert_parsed_expression_simplify_to("frac([[1/R(2),1/2][1,-1.3]])", "[[frac(R(2)/2),1/2][0,0.7]]");
assert_parsed_expression_simplify_to("gcd([[1/R(2),1/2][1,-1.3]], [[1]])", "undef");
assert_parsed_expression_simplify_to("gcd([[1/R(2),1/2][1,-1.3]], [[1]])", Undefined::Name());
assert_parsed_expression_simplify_to("asinh([[1/R(2),1/2][1,-1]])", "[[asinh(1/R(2)),asinh(1/2)][asinh(1),asinh(-1)]]");
assert_parsed_expression_simplify_to("atanh([[R(3),1][1/R(3),-1]])", "[[atanh(R(3)),atanh(1)][atanh(1/R(3)),atanh(-1)]]");
assert_parsed_expression_simplify_to("acosh([[1/R(2),1/2][1,-1]])", "[[acosh(1/R(2)),acosh(1/2)][acosh(1),acosh(-1)]]");
@@ -72,32 +72,32 @@ QUIZ_CASE(poincare_matrix_simplify) {
assert_parsed_expression_simplify_to("tanh([[R(3),1][1/R(3),-1]])", "[[tanh(R(3)),tanh(1)][tanh(1/R(3)),tanh(-1)]]");
assert_parsed_expression_simplify_to("cosh([[1/R(2),1/2][1,-1]])", "[[cosh(1/R(2)),cosh(1/2)][cosh(1),cosh(-1)]]");
assert_parsed_expression_simplify_to("im([[1/R(2),1/2][1,-1]])", "[[im(1/R(2)),0][0,0]]");
assert_parsed_expression_simplify_to("int([[P/3,0][P/7,P/2]],3,2)", "undef");
assert_parsed_expression_simplify_to("lcm(2, [[1]])", "undef");
assert_parsed_expression_simplify_to("int([[P/3,0][P/7,P/2]],3,2)", Undefined::Name());
assert_parsed_expression_simplify_to("lcm(2, [[1]])", Undefined::Name());
assert_parsed_expression_simplify_to("log([[R(2),1/2][1,3]])", "[[(1/2)*log(2),-log(2)][0,log(3)]]");
assert_parsed_expression_simplify_to("log([[1/R(2),1/2][1,-3]])", "undef");
assert_parsed_expression_simplify_to("log([[1/R(2),1/2][1,-3]],3)", "undef");
assert_parsed_expression_simplify_to("log([[1/R(2),1/2][1,-3]])", Undefined::Name());
assert_parsed_expression_simplify_to("log([[1/R(2),1/2][1,-3]],3)", Undefined::Name());
assert_parsed_expression_simplify_to("ln([[R(2),1/2][1,3]])", "[[(1/2)*ln(2),-ln(2)][0,ln(3)]]");
assert_parsed_expression_simplify_to("log([[1/R(2),1/2][1,-3]])", "undef");
assert_parsed_expression_simplify_to("log([[1/R(2),1/2][1,-3]])", Undefined::Name());
assert_parsed_expression_simplify_to("dim([[1/R(2),1/2,3][2,1,-3]])", "[[2,3]]");
assert_parsed_expression_simplify_to("inverse([[1/R(2),1/2,3][2,1,-3]])", "undef");
assert_parsed_expression_simplify_to("inverse([[1/R(2),1/2,3][2,1,-3]])", Undefined::Name());
assert_parsed_expression_simplify_to("inverse([[1,2][3,4]])", "inverse([[1,2][3,4]])"); // TODO: implement matrix inverse if dim < 3
assert_parsed_expression_simplify_to("trace([[1/R(2),1/2,3][2,1,-3]])", "undef");
assert_parsed_expression_simplify_to("trace([[1/R(2),1/2,3][2,1,-3]])", Undefined::Name());
assert_parsed_expression_simplify_to("trace([[R(2),2][4,3+log(3)]])", "R(2)+3+log(3)");
assert_parsed_expression_simplify_to("trace(R(2)+log(3))", "R(2)+log(3)");
assert_parsed_expression_simplify_to("transpose([[1/R(2),1/2,3][2,1,-3]])", "[[1/R(2),2][1/2, 1][3,-3]]");
assert_parsed_expression_simplify_to("transpose(R(4))", "2");
assert_parsed_expression_simplify_to("root([[R(4)]],2)", "undef");
assert_parsed_expression_simplify_to("root([[R(4)]],2)", Undefined::Name());
assert_parsed_expression_simplify_to("root(4,3)", "4^(1/3)");
assert_parsed_expression_simplify_to("-[[1/R(2),1/2,3][2,1,-3]]", "[[-1/R(2),-1/2,-3][-2,-1,3]]");
assert_parsed_expression_simplify_to("permute([[1,-2][3,4]], 2)", "undef");
assert_parsed_expression_simplify_to("permute([[1,-2][3,4]], 2)", Undefined::Name());
assert_parsed_expression_simplify_to("prediction95(1/3, 25)", "[[1/3-49R(2)/375,1/3+49R(2)/375]]");
assert_parsed_expression_simplify_to("prediction95(45, 25)", "undef");
assert_parsed_expression_simplify_to("prediction95(1/3, -34)", "undef");
assert_parsed_expression_simplify_to("prediction95(45, 25)", Undefined::Name());
assert_parsed_expression_simplify_to("prediction95(1/3, -34)", Undefined::Name());
assert_parsed_expression_simplify_to("product([[1,2][3,4]], 1/3, -34)", "product([[1,2][3,4]], 1/3, -34)");
assert_parsed_expression_simplify_to("sum([[1,2][3,4]], 1/3, -34)", "sum([[1,2][3,4]], 1/3, -34)");
assert_parsed_expression_simplify_to("re([[1/R(2),1/2][1,-1]])", "[[re(1/R(2)),1/2][1,-1]]");
assert_parsed_expression_simplify_to("round([[1/R(2),1/2][1,-1]],2)", "undef");
assert_parsed_expression_simplify_to("round([[1/R(2),1/2][1,-1]],2)", Undefined::Name());
assert_parsed_expression_simplify_to("sin([[P/3,0][P/7,P/2]])", "[[R(3)/2,0][sin(P/7),1]]");
assert_parsed_expression_simplify_to("R([[4,2][P/7,1]])", "[[2,R(2)][R(P/7),1]]");
assert_parsed_expression_simplify_to("tan([[P/3,0][P/7,P/6]])", "[[R(3),0][tan(P/7),R(3)/3]]");

View File

@@ -268,7 +268,7 @@ QUIZ_CASE(poincare_parser_symbols_and_functions) {
assert_parsed_expression_is("P", Constant(Ion::Charset::SmallPi));
assert_parsed_expression_is("X", Constant(Ion::Charset::Exponential));
assert_parsed_expression_is("inf", Infinity(false));
assert_parsed_expression_is("undef", Undefined());
assert_parsed_expression_is(Undefined::Name(), Undefined());
assert_raises_parsing_error("u");
assert_raises_parsing_error("v");

View File

@@ -12,9 +12,9 @@ QUIZ_CASE(poincare_power_evaluate) {
assert_parsed_expression_evaluates_to<float>("4^(3+I)", "11.74125+62.91378*I");
assert_parsed_expression_evaluates_to<double>("(3+I)^(3+I)", "(-11.898191759852)+19.592921596609*I");
assert_parsed_expression_evaluates_to<double>("0^0", "undef");
assert_parsed_expression_evaluates_to<double>("0^0", Undefined::Name());
assert_parsed_expression_evaluates_to<double>("0^2", "0");
assert_parsed_expression_evaluates_to<double>("0^(-2)", "undef");
assert_parsed_expression_evaluates_to<double>("0^(-2)", Undefined::Name());
assert_parsed_expression_evaluates_to<double>("(-2)^4.2", "14.8690638497+10.8030072384*I", Radian, Cartesian, 12);
assert_parsed_expression_evaluates_to<double>("(-0.1)^4", "0.0001", Radian, Cartesian, 12);
#if MATRICES_ARE_DEFINED
@@ -42,8 +42,8 @@ QUIZ_CASE(poincare_power_simplify) {
assert_parsed_expression_simplify_to("1^x", "1");
assert_parsed_expression_simplify_to("x^1", "x");
assert_parsed_expression_simplify_to("0^3", "0");
assert_parsed_expression_simplify_to("0^0", "undef");
assert_parsed_expression_simplify_to("0^(-3)", "undef");
assert_parsed_expression_simplify_to("0^0", Undefined::Name());
assert_parsed_expression_simplify_to("0^(-3)", Undefined::Name());
assert_parsed_expression_simplify_to("4^0.5", "2");
assert_parsed_expression_simplify_to("8^0.5", "2*R(2)");
assert_parsed_expression_simplify_to("(12^4*3)^(0.5)", "144*R(3)");

View File

@@ -120,7 +120,7 @@ QUIZ_CASE(poincare_rational_simplify) {
assert_parsed_expression_simplify_to("56^56", "79164324866862966607842406018063254671922245312646690223362402918484170424104310169552592050323456");
assert_parsed_expression_simplify_to("999^999", "999^999");
assert_parsed_expression_simplify_to("999^-999", "1/999^999");
assert_parsed_expression_simplify_to("0^0", "undef");
assert_parsed_expression_simplify_to("0^0", Undefined::Name());
assert_parsed_expression_simplify_to("x^0", "1");
assert_parsed_expression_simplify_to("P^0", "1");
assert_parsed_expression_simplify_to("A^0", "1");

View File

@@ -13,10 +13,10 @@ using namespace Poincare;
QUIZ_CASE(poincare_simplify_mix) {
// 0 and infinity
assert_parsed_expression_simplify_to("0/0", "undef");
assert_parsed_expression_simplify_to("0/0", Undefined::Name());
assert_parsed_expression_simplify_to("0/inf", "0");
assert_parsed_expression_simplify_to("inf/0", "undef");
assert_parsed_expression_simplify_to("0*inf", "undef");
assert_parsed_expression_simplify_to("inf/0", Undefined::Name());
assert_parsed_expression_simplify_to("0*inf", Undefined::Name());
assert_parsed_expression_simplify_to("3*inf/inf", "inf/inf"); //TODO undef would be better
// Root at denominator

View File

@@ -55,7 +55,7 @@ QUIZ_CASE(poincare_store_overwrite) {
QUIZ_CASE(poincare_store_do_not_overwrite) {
assert_parsed_expression_simplify_to("-1>g(x)", "-1");
assert_parsed_expression_simplify_to("1+g(x)>f(x)", "1+g(x)");
assert_parsed_expression_simplify_to("2>g", "undef");
assert_parsed_expression_simplify_to("2>g", Undefined::Name());
assert_parsed_expression_evaluates_to<double>("g(4)", "-1");
assert_parsed_expression_evaluates_to<double>("f(4)", "0");

View File

@@ -72,8 +72,8 @@ QUIZ_CASE(poincare_trigo_evaluate) {
assert_parsed_expression_evaluates_to<double>("tan(2)", "-2.1850398632615", Radian);
assert_parsed_expression_evaluates_to<double>("tan(2)", "3.4920769491748E-2", Degree);
// Tangent-style
assert_parsed_expression_evaluates_to<float>("tan(P/2)", "undef", Radian);
assert_parsed_expression_evaluates_to<double>("tan(3*P/2)", "undef", Radian);
assert_parsed_expression_evaluates_to<float>("tan(P/2)", Undefined::Name(), Radian);
assert_parsed_expression_evaluates_to<double>("tan(3*P/2)", Undefined::Name(), Radian);
assert_parsed_expression_evaluates_to<float>("tan(3*P)", "0", Radian);
assert_parsed_expression_evaluates_to<float>("tan(-540)", "0", Degree);
// On R*i
@@ -228,11 +228,11 @@ QUIZ_CASE(poincare_trigo_evaluate) {
assert_parsed_expression_evaluates_to<double>("tanh(43*I)", "-1.4983873388552*I", Radian);
// Tangent-style
// FIXME: this depends on the libm implementation and does not work on travis/appveyor servers
/*assert_parsed_expression_evaluates_to<float>("tanh(P*I/2)", "undef", Radian);
assert_parsed_expression_evaluates_to<float>("tanh(5*P*I/2)", "undef", Radian);
assert_parsed_expression_evaluates_to<float>("tanh(7*P*I/2)", "undef", Radian);
/*assert_parsed_expression_evaluates_to<float>("tanh(P*I/2)", Undefined::Name(), Radian);
assert_parsed_expression_evaluates_to<float>("tanh(5*P*I/2)", Undefined::Name(), Radian);
assert_parsed_expression_evaluates_to<float>("tanh(7*P*I/2)", Undefined::Name(), Radian);
assert_parsed_expression_evaluates_to<float>("tanh(8*P*I/2)", "0", Radian);
assert_parsed_expression_evaluates_to<float>("tanh(9*P*I/2)", "undef", Radian);*/
assert_parsed_expression_evaluates_to<float>("tanh(9*P*I/2)", Undefined::Name(), Radian);*/
// On C
assert_parsed_expression_evaluates_to<float>("tanh(I-4)", "(-1.00028)+0.000610241*I", Radian, Cartesian, 6);
assert_parsed_expression_evaluates_to<float>("tanh(I-4)", "(-1.00028)+0.000610241*I", Degree, Cartesian, 6);
@@ -429,7 +429,7 @@ QUIZ_CASE(poincare_trigo_simplify) {
assert_parsed_expression_simplify_to("tan(P/12)", "2-R(3)");
assert_parsed_expression_simplify_to("tan(-P/12)", "(-2)+R(3)");
assert_parsed_expression_simplify_to("tan(-P*R(2))", "-tan(R(2)*P)");
assert_parsed_expression_simplify_to("tan(1311P/6)", "undef");
assert_parsed_expression_simplify_to("tan(1311P/6)", Undefined::Name());
assert_parsed_expression_simplify_to("tan(-P17/8)", "1-R(2)");
assert_parsed_expression_simplify_to("tan(41P/6)", "-R(3)/3");
assert_parsed_expression_simplify_to("tan(P/4+1000P)", "1");
@@ -445,7 +445,7 @@ QUIZ_CASE(poincare_trigo_simplify) {
assert_parsed_expression_simplify_to("tan(15)", "2-R(3)", Preferences::AngleUnit::Degree);
assert_parsed_expression_simplify_to("tan(-15)", "(-2)+R(3)", Preferences::AngleUnit::Degree);
assert_parsed_expression_simplify_to("tan(-180*R(2))", "-tan(180*R(2))", Preferences::AngleUnit::Degree);
assert_parsed_expression_simplify_to("tan(39330)", "undef", Preferences::AngleUnit::Degree);
assert_parsed_expression_simplify_to("tan(39330)", Undefined::Name(), Preferences::AngleUnit::Degree);
assert_parsed_expression_simplify_to("tan(-382.5)", "1-R(2)", Preferences::AngleUnit::Degree);
assert_parsed_expression_simplify_to("tan(1230)", "-R(3)/3", Preferences::AngleUnit::Degree);
assert_parsed_expression_simplify_to("tan(180045)", "1", Preferences::AngleUnit::Degree);

View File

@@ -45,8 +45,8 @@ QUIZ_CASE(poincare_user_variable_simple) {
QUIZ_CASE(poincare_user_variable_2_circular_variables) {
assert_simplify("a>b");
assert_simplify("b>a");
assert_parsed_expression_evaluates_to<double>("a", "undef");
assert_parsed_expression_evaluates_to<double>("b", "undef");
assert_parsed_expression_evaluates_to<double>("a", Undefined::Name());
assert_parsed_expression_evaluates_to<double>("b", Undefined::Name());
// Clean the storage for other tests
Ion::Storage::sharedStorage()->recordNamed("a.exp").destroy();
@@ -57,9 +57,9 @@ QUIZ_CASE(poincare_user_variable_3_circular_variables) {
assert_simplify("a>b");
assert_simplify("b>c");
assert_simplify("c>a");
assert_parsed_expression_evaluates_to<double>("a", "undef");
assert_parsed_expression_evaluates_to<double>("b", "undef");
assert_parsed_expression_evaluates_to<double>("c", "undef");
assert_parsed_expression_evaluates_to<double>("a", Undefined::Name());
assert_parsed_expression_evaluates_to<double>("b", Undefined::Name());
assert_parsed_expression_evaluates_to<double>("c", Undefined::Name());
// Clean the storage for other tests
Ion::Storage::sharedStorage()->recordNamed("a.exp").destroy();
@@ -70,7 +70,7 @@ QUIZ_CASE(poincare_user_variable_3_circular_variables) {
QUIZ_CASE(poincare_user_variable_1_circular_function) {
// g: x -> f(x)+1
assert_simplify("f(x)+1>g(x)");
assert_parsed_expression_evaluates_to<double>("g(1)", "undef");
assert_parsed_expression_evaluates_to<double>("g(1)", Undefined::Name());
// f: x -> x+1
assert_simplify("x+1>f(x)");
assert_parsed_expression_evaluates_to<double>("g(1)", "3");
@@ -79,7 +79,7 @@ QUIZ_CASE(poincare_user_variable_1_circular_function) {
assert_simplify("h(x)>h(x)");
assert_parsed_expression_evaluates_to<double>("f(1)", "2");
assert_parsed_expression_evaluates_to<double>("g(1)", "3");
assert_parsed_expression_evaluates_to<double>("h(1)", "undef");
assert_parsed_expression_evaluates_to<double>("h(1)", Undefined::Name());
// Clean the storage for other tests
Ion::Storage::sharedStorage()->recordNamed("f.func").destroy();
@@ -90,8 +90,8 @@ QUIZ_CASE(poincare_user_variable_1_circular_function) {
QUIZ_CASE(poincare_user_variable_2_circular_functions) {
assert_simplify("f(x)>g(x)");
assert_simplify("g(x)>f(x)");
assert_parsed_expression_evaluates_to<double>("f(1)", "undef");
assert_parsed_expression_evaluates_to<double>("g(1)", "undef");
assert_parsed_expression_evaluates_to<double>("f(1)", Undefined::Name());
assert_parsed_expression_evaluates_to<double>("g(1)", Undefined::Name());
// Clean the storage for other tests
Ion::Storage::sharedStorage()->recordNamed("f.func").destroy();
@@ -102,9 +102,9 @@ QUIZ_CASE(poincare_user_variable_3_circular_functions) {
assert_simplify("f(x)>g(x)");
assert_simplify("g(x)>h(x)");
assert_simplify("h(x)>f(x)");
assert_parsed_expression_evaluates_to<double>("f(1)", "undef");
assert_parsed_expression_evaluates_to<double>("g(1)", "undef");
assert_parsed_expression_evaluates_to<double>("h(1)", "undef");
assert_parsed_expression_evaluates_to<double>("f(1)", Undefined::Name());
assert_parsed_expression_evaluates_to<double>("g(1)", Undefined::Name());
assert_parsed_expression_evaluates_to<double>("h(1)", Undefined::Name());
// Clean the storage for other tests
Ion::Storage::sharedStorage()->recordNamed("f.func").destroy();
@@ -116,9 +116,9 @@ QUIZ_CASE(poincare_user_variable_circular_variables_and_functions) {
assert_simplify("a>b");
assert_simplify("b>a");
assert_simplify("a>f(x)");
assert_parsed_expression_evaluates_to<double>("f(1)", "undef");
assert_parsed_expression_evaluates_to<double>("a", "undef");
assert_parsed_expression_evaluates_to<double>("b", "undef");
assert_parsed_expression_evaluates_to<double>("f(1)", Undefined::Name());
assert_parsed_expression_evaluates_to<double>("a", Undefined::Name());
assert_parsed_expression_evaluates_to<double>("b", Undefined::Name());
// Clean the storage for other tests
Ion::Storage::sharedStorage()->recordNamed("f.func").destroy();