diff --git a/calcApp/Db/aneg_apos_test.db b/calcApp/Db/aneg_apos_test.db new file mode 100644 index 0000000..add9d78 --- /dev/null +++ b/calcApp/Db/aneg_apos_test.db @@ -0,0 +1,44 @@ +record(waveform, "$(P):test_array") +{ + field(NELM, "10") + field(FTVL, "LONG") + field(INP, "[0, -1, 2, -3, 4, -5, 6, -7, 8, -9]") +} + +record(ao, "$(P):test_number") +{ + field(PINI, "YES") + field(VAL, "-10") +} + +record(acalcout, "$(P):calc_aneg_array") +{ + field(NELM, "10") + field(NUSE, "10") + field(INAA, "$(P):test_array CP NMA") + field(CALC, "ANEG(AA)") +} + +record(acalcout, "$(P):calc_aneg") +{ + field(NELM, "10") + field(NUSE, "10") + field(INPA, "$(P):test_number CP NMA") + field(CALC, "ANEG(A)") +} + +record(acalcout, "$(P):calc_apos_array") +{ + field(NELM, "10") + field(NUSE, "10") + field(INAA, "$(P):test_array CP NMA") + field(CALC, "APOS(AA)") +} + +record(acalcout, "$(P):calc_apos") +{ + field(NELM, "10") + field(NUSE, "10") + field(INPA, "$(P):test_number CP NMA") + field(CALC, "APOS(A)") +} \ No newline at end of file diff --git a/calcApp/src/aCalcPerform.c b/calcApp/src/aCalcPerform.c index f6e7eea..43785e3 100644 --- a/calcApp/src/aCalcPerform.c +++ b/calcApp/src/aCalcPerform.c @@ -745,6 +745,8 @@ long aCalcPerform(double *p_dArg, int num_dArgs, double **pp_aArg, case NINT: case AMAX: case AMIN: + case ANEG_VAL: + case APOS_VAL: case IXMAX: case IXMIN: case IXZ: @@ -762,6 +764,8 @@ long aCalcPerform(double *p_dArg, int num_dArgs, double **pp_aArg, if (isArray(ps)) { switch (op) { case ABS_VAL: for (i=0; ia[i] < 0) ps->a[i] *= -1;} break; + case ANEG_VAL: for (i=0; ia[i] < 0) ps->a[i] = 0;} break; + case APOS_VAL: for (i=0; ia[i] > 0) ps->a[i] = 0;} break; case UNARY_NEG: for (i=0; ia[i] *= -1;} break; case SQU_RT: status = 0; @@ -1029,6 +1033,8 @@ long aCalcPerform(double *p_dArg, int num_dArgs, double **pp_aArg, } else { /* if (isArray(ps)) */ switch (op) { case ABS_VAL: if (ps->d < 0) {ps->d *= -1;} break; + case ANEG_VAL: if (ps->d < 0) {ps->d = 0;} break; + case APOS_VAL: if (ps->d > 0) {ps->d = 0;} break; case UNARY_NEG: ps->d *= -1; break; case SQU_RT: if (ps->d < 0) { diff --git a/calcApp/src/aCalcPostfix.c b/calcApp/src/aCalcPostfix.c index 589b206..4494342 100644 --- a/calcApp/src/aCalcPostfix.c +++ b/calcApp/src/aCalcPostfix.c @@ -150,6 +150,8 @@ static const ELEMENT operands[] = { {"I", 0, 0, 1, OPERAND, FETCH_I}, {"II", 0, 0, 1, OPERAND, FETCH_II}, {"INT", 9, 10, 0, UNARY_OPERATOR, NINT}, +{"ANEG", 9, 10, 0, UNARY_OPERATOR, ANEG_VAL}, +{"APOS", 9, 10, 0, UNARY_OPERATOR, APOS_VAL}, {"ISINF", 9, 10, 0, UNARY_OPERATOR, ISINF}, {"ISNAN", 9, 10, 0, VARARG_OPERATOR, ISNAN}, {"IX", 0, 0, 1, OPERAND, CONST_IX}, @@ -305,6 +307,8 @@ static const char *opcodes[] = { /* Algebraic */ "ABS_VAL", "EXP", + "ANEG_VAL", + "APOS_VAL", "LOG_10", "LOG_E", "MAX", diff --git a/calcApp/src/aCalcPostfixPvt.h b/calcApp/src/aCalcPostfixPvt.h index 0170b6b..7eb5a50 100644 --- a/calcApp/src/aCalcPostfixPvt.h +++ b/calcApp/src/aCalcPostfixPvt.h @@ -56,6 +56,8 @@ typedef enum { /* Algebraic */ ABS_VAL, EXP, + ANEG_VAL, + APOS_VAL, LOG_10, LOG_E, MAX,