support isinf; epicsIsNAN=>isnan; add test for epicsMath
This commit is contained in:
@@ -104,8 +104,7 @@
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#include <epicsMath.h>
|
||||
#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));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -62,11 +62,10 @@
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#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));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
#ifndef epicsMathh
|
||||
#define epicsMathh
|
||||
|
||||
#include <math.h>
|
||||
#define isinf(D) 0
|
||||
|
||||
#endif /* epicsMathh */
|
||||
@@ -2,8 +2,10 @@
|
||||
#ifndef epicsMathh
|
||||
#define epicsMathh
|
||||
|
||||
#include <math.h>
|
||||
#include <float.h>
|
||||
|
||||
#define epicsIsNAN(D) _isnan(D)
|
||||
#define isnan(D) _isnan(D)
|
||||
#define isinf(D) _isinf(D)
|
||||
|
||||
#endif /* epicsMathh */
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
|
||||
#ifndef epicsMathh
|
||||
#define epicsMathh
|
||||
|
||||
#include <math.h>
|
||||
|
||||
#define epicsIsNAN(D) isnan(D)
|
||||
|
||||
#endif /* epicsMathh */
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
#ifndef epicsMathh
|
||||
#define epicsMathh
|
||||
|
||||
#include <math.h>
|
||||
|
||||
#include <ieeefp.h>
|
||||
#define isinf(x) (((x)==(x)) && !finite((x)))
|
||||
/* same as (!isnan(x) && !finite(x)) */
|
||||
|
||||
#endif /* epicsMathh */
|
||||
@@ -2,8 +2,10 @@
|
||||
#ifndef epicsMathh
|
||||
#define epicsMathh
|
||||
|
||||
#include <math.h>
|
||||
#include <private/mathP.h>
|
||||
|
||||
#define epicsIsNAN(D) isNan(D)
|
||||
#define isnan(D) isNan(D)
|
||||
#define isinf(D) isInf(D)
|
||||
|
||||
#endif /* epicsMathh */
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
/* epicsMathTest.c
|
||||
*
|
||||
* Author Marty Kraimer
|
||||
*/
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#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]);
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
/* epicsMathTestMain.cpp
|
||||
*
|
||||
* Author Marty Kraimer
|
||||
*/
|
||||
|
||||
extern "C" {
|
||||
void epicsMathTest ( void );
|
||||
}
|
||||
|
||||
int main ( int , char *[] )
|
||||
{
|
||||
epicsMathTest ();
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user