diff --git a/src/libCom/calc/calcPerform.c b/src/libCom/calc/calcPerform.c index 459c9fb2d..c64bb37c1 100644 --- a/src/libCom/calc/calcPerform.c +++ b/src/libCom/calc/calcPerform.c @@ -104,8 +104,7 @@ #include #include #include -#include -#include +#include "epicsMath.h" #include "dbDefs.h" @@ -512,7 +511,7 @@ printf ("*FINISHED*\n"); *presult = *pstacktop; else return(-1); - return((epicsIsNAN(*presult) ? -1 : 0)); + return(((isnan(*presult)||isinf(*presult)) ? -1 : 0)); } diff --git a/src/libCom/calc/sCalcPerform.c b/src/libCom/calc/sCalcPerform.c index b7c53dbf6..686fb683d 100644 --- a/src/libCom/calc/sCalcPerform.c +++ b/src/libCom/calc/sCalcPerform.c @@ -62,11 +62,10 @@ #include #include #include -#include +#include "epicsMath.h" #include "dbDefs.h" #define epicsExportSharedSymbols -#include "epicsMath.h" #include "cvtFast.h" #include "sCalcPostfix.h" #include "sCalcPostfixPvt.h" @@ -142,10 +141,13 @@ static void to_string(struct stackElement *ps) { ps->s = calloc(20, 1); /* any precision greater than 8 results in (slow) sprintf call */ - if (epicsIsNAN(ps->d)) - strcpy(ps->s,"NaN"); - else + if (isnan(ps->d)) { + strcpy(ps->s,"nan"); + } else if (isinf(ps->d)) { + strcpy(ps->s,"inf"); + } else { (void)cvtDoubleToString(ps->d, ps->s, 8); + } } static char *findConversionIndicator(char *s) @@ -637,10 +639,13 @@ printf(") \n"); #endif *presult = *pd; if (psresult && (lenSresult > 15)) { - if (epicsIsNAN(*pd)) - strcpy(psresult,"NaN"); - else + if (isnan(*pd)) { + strcpy(psresult,"nan"); + } else if (isinf(*pd)) { + strcpy(psresult,"inf"); + } else { (void)cvtDoubleToString(*pd, psresult, 8); + } } } else { @@ -1418,7 +1423,7 @@ printf(") \n"); } /* if (*post++ != USES_STRING) {} else */ - return(0); + return(((isnan(*presult)||isinf(*presult)) ? -1 : 0)); } diff --git a/src/libCom/osi/os/VMS/epicsMath.h b/src/libCom/osi/os/VMS/epicsMath.h new file mode 100644 index 000000000..88c95b24f --- /dev/null +++ b/src/libCom/osi/os/VMS/epicsMath.h @@ -0,0 +1,7 @@ +#ifndef epicsMathh +#define epicsMathh + +#include +#define isinf(D) 0 + +#endif /* epicsMathh */ diff --git a/src/libCom/osi/os/WIN32/epicsMath.h b/src/libCom/osi/os/WIN32/epicsMath.h index da4a8a2c3..8b9fc3a0f 100644 --- a/src/libCom/osi/os/WIN32/epicsMath.h +++ b/src/libCom/osi/os/WIN32/epicsMath.h @@ -2,8 +2,10 @@ #ifndef epicsMathh #define epicsMathh +#include #include -#define epicsIsNAN(D) _isnan(D) +#define isnan(D) _isnan(D) +#define isinf(D) _isinf(D) #endif /* epicsMathh */ diff --git a/src/libCom/osi/os/posix/epicsMath.h b/src/libCom/osi/os/posix/epicsMath.h index bb8ce4fd8..5b3e0076f 100644 --- a/src/libCom/osi/os/posix/epicsMath.h +++ b/src/libCom/osi/os/posix/epicsMath.h @@ -1,9 +1,6 @@ - #ifndef epicsMathh #define epicsMathh #include -#define epicsIsNAN(D) isnan(D) - #endif /* epicsMathh */ diff --git a/src/libCom/osi/os/solaris/epicsMath.h b/src/libCom/osi/os/solaris/epicsMath.h new file mode 100644 index 000000000..3f97b589b --- /dev/null +++ b/src/libCom/osi/os/solaris/epicsMath.h @@ -0,0 +1,10 @@ +#ifndef epicsMathh +#define epicsMathh + +#include + +#include +#define isinf(x) (((x)==(x)) && !finite((x))) +/* same as (!isnan(x) && !finite(x)) */ + +#endif /* epicsMathh */ diff --git a/src/libCom/osi/os/vxWorks/epicsMath.h b/src/libCom/osi/os/vxWorks/epicsMath.h index fa84e53de..c711a5702 100644 --- a/src/libCom/osi/os/vxWorks/epicsMath.h +++ b/src/libCom/osi/os/vxWorks/epicsMath.h @@ -2,8 +2,10 @@ #ifndef epicsMathh #define epicsMathh +#include #include -#define epicsIsNAN(D) isNan(D) +#define isnan(D) isNan(D) +#define isinf(D) isInf(D) #endif /* epicsMathh */ diff --git a/src/libCom/test/Makefile b/src/libCom/test/Makefile index de637d516..8cfa28478 100644 --- a/src/libCom/test/Makefile +++ b/src/libCom/test/Makefile @@ -13,6 +13,10 @@ epicsAlgorithmTest_SRCS += epicsAlgorithmTest.cpp PROD_HOST += epicsAlgorithmTest OBJS_IOC += epicsAlgorithmTest +epicsMathTestHost_SRCS += epicsMathTestMain.cpp epicsMathTest.c +PROD_HOST += epicsMathTestHost +OBJS_IOC += epicsMathTest + epicsTimeTestHost_SRCS += epicsTimeTestMain.cpp epicsTimeTest.cpp PROD_HOST += epicsTimeTestHost OBJS_IOC += epicsTimeTest diff --git a/src/libCom/test/epicsMathTest.c b/src/libCom/test/epicsMathTest.c new file mode 100644 index 000000000..2b2d8fc4e --- /dev/null +++ b/src/libCom/test/epicsMathTest.c @@ -0,0 +1,35 @@ +/* epicsMathTest.c + * + * Author Marty Kraimer + */ + +#include +#include +#include +#include +#include + +#include "epicsMath.h" + +static char *truth[2] = {"false","true"}; + +void epicsMathTest () +{ + double a,b,c; + + a=0.0; b=0.0; c=a/b; + printf("a %e b %e c %e isnan %s isinf %s\n", + a,b,c,truth[isnan(c) ? 1 : 0],truth[isinf(c) ? 1 : 0]); + a=1e300; b=1e-300; c=a/b; + printf("a %e b %e c %e isnan %s isinf %s\n", + a,b,c,truth[isnan(c) ? 1 : 0],truth[isinf(c) ? 1 : 0]); + a=-1e300; b=1e-300; c=a/b; + printf("a %e b %e c %e isnan %s isinf %s\n", + a,b,c,truth[isnan(c) ? 1 : 0],truth[isinf(c) ? 1 : 0]); + a=0.0; b=1.0; c=a/b; + printf("a %e b %e c %e isnan %s isinf %s\n", + a,b,c,truth[isnan(c) ? 1 : 0],truth[isinf(c) ? 1 : 0]); + a=1e300; b=1e300; c=a/b; + printf("a %e b %e c %e isnan %s isinf %s\n", + a,b,c,truth[isnan(c) ? 1 : 0],truth[isinf(c) ? 1 : 0]); +} diff --git a/src/libCom/test/epicsMathTestMain.cpp b/src/libCom/test/epicsMathTestMain.cpp new file mode 100644 index 000000000..c57010377 --- /dev/null +++ b/src/libCom/test/epicsMathTestMain.cpp @@ -0,0 +1,14 @@ +/* epicsMathTestMain.cpp + * + * Author Marty Kraimer + */ + +extern "C" { +void epicsMathTest ( void ); +} + +int main ( int , char *[] ) +{ + epicsMathTest (); + return 0; +}