From a6afef4850c3357819173acbc37ffd880bddfe61 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Mon, 28 Mar 2022 11:37:57 -0700 Subject: [PATCH] calc: add FMOD --- documentation/RELEASE_NOTES.md | 4 ++++ modules/database/src/std/rec/calcRecord.dbd.pod | 3 +++ modules/database/src/std/rec/calcoutRecord.dbd.pod | 3 +++ modules/libcom/src/calc/calcPerform.c | 5 +++++ modules/libcom/src/calc/postfix.c | 1 + modules/libcom/src/calc/postfixPvt.h | 1 + modules/libcom/test/epicsCalcTest.cpp | 7 ++++++- 7 files changed, 23 insertions(+), 1 deletion(-) diff --git a/documentation/RELEASE_NOTES.md b/documentation/RELEASE_NOTES.md index a680dec53..c1914e95f 100644 --- a/documentation/RELEASE_NOTES.md +++ b/documentation/RELEASE_NOTES.md @@ -17,6 +17,10 @@ should also be read to understand what has changed since earlier releases. +### Add FMOD as CALC Expression + +The floating point modulo function `FMOD(NUM,DEN)` is added. + ## EPICS Release 7.0.7 ### Doxygen Annotations diff --git a/modules/database/src/std/rec/calcRecord.dbd.pod b/modules/database/src/std/rec/calcRecord.dbd.pod index df1c60c81..053ce85c5 100644 --- a/modules/database/src/std/rec/calcRecord.dbd.pod +++ b/modules/database/src/std/rec/calcRecord.dbd.pod @@ -157,6 +157,9 @@ CEIL: Ceiling (unary) =item * FLOOR: Floor (unary) +=item * +FMOD: Floating point modulo (binary) Added in UNRELEASED + =item * LOG: Log base 10 (unary) diff --git a/modules/database/src/std/rec/calcoutRecord.dbd.pod b/modules/database/src/std/rec/calcoutRecord.dbd.pod index ac39a9a0b..b62f57520 100644 --- a/modules/database/src/std/rec/calcoutRecord.dbd.pod +++ b/modules/database/src/std/rec/calcoutRecord.dbd.pod @@ -183,6 +183,9 @@ CEIL: Ceiling (unary) =item * FLOOR: Floor (unary) +=item * +FMOD: Floating point modulo (binary) Added in UNRELEASED + =item * LOG: Log base 10 (unary) diff --git a/modules/libcom/src/calc/calcPerform.c b/modules/libcom/src/calc/calcPerform.c index 39b1c3f9d..81fbdc10c 100644 --- a/modules/libcom/src/calc/calcPerform.c +++ b/modules/libcom/src/calc/calcPerform.c @@ -240,6 +240,11 @@ LIBCOM_API long *ptop = floor(*ptop); break; + case FMOD: + top = *ptop--; + *ptop = fmod(*ptop, top); + break; + case FINITE: nargs = *pinst++; top = finite(*ptop); diff --git a/modules/libcom/src/calc/postfix.c b/modules/libcom/src/calc/postfix.c index b3a99e08b..7457abaab 100644 --- a/modules/libcom/src/calc/postfix.c +++ b/modules/libcom/src/calc/postfix.c @@ -104,6 +104,7 @@ static const ELEMENT operands[] = { {"F", 0, 0, 1, OPERAND, FETCH_F}, {"FINITE", 7, 8, 0, VARARG_OPERATOR,FINITE}, {"FLOOR", 7, 8, 0, UNARY_OPERATOR, FLOOR}, +{"FMOD", 7, 8, -1, UNARY_OPERATOR, FMOD}, {"G", 0, 0, 1, OPERAND, FETCH_G}, {"H", 0, 0, 1, OPERAND, FETCH_H}, {"I", 0, 0, 1, OPERAND, FETCH_I}, diff --git a/modules/libcom/src/calc/postfixPvt.h b/modules/libcom/src/calc/postfixPvt.h index f79c4b2d5..3e84e1fb4 100644 --- a/modules/libcom/src/calc/postfixPvt.h +++ b/modules/libcom/src/calc/postfixPvt.h @@ -71,6 +71,7 @@ typedef enum { /* Numeric */ CEIL, FLOOR, + FMOD, FINITE, ISINF, ISNAN, diff --git a/modules/libcom/test/epicsCalcTest.cpp b/modules/libcom/test/epicsCalcTest.cpp index cf4cf9b62..870547e4d 100644 --- a/modules/libcom/test/epicsCalcTest.cpp +++ b/modules/libcom/test/epicsCalcTest.cpp @@ -298,7 +298,7 @@ MAIN(epicsCalcTest) const double a=1.0, b=2.0, c=3.0, d=4.0, e=5.0, f=6.0, g=7.0, h=8.0, i=9.0, j=10.0, k=11.0, l=12.0; - testPlan(630); + testPlan(635); /* LITERAL_OPERAND elements */ testExpr(0); @@ -370,6 +370,11 @@ MAIN(epicsCalcTest) testExpr(cosh(0.5)); testExpr(exp(1.)); testExpr(floor(1.5)); + testExpr(fmod(1.5, 1.0)); + testExpr(fmod(-1.5, 1.0)); + testExpr(fmod(1.5, -1.0)); + testExpr(fmod(-1.5, -1.0)); + testExpr(fmod(1.5, 0.0)); testExpr(finite(0.)); testExpr(finite(Inf));