support isinf; epicsIsNAN=>isnan; add test for epicsMath

This commit is contained in:
Marty Kraimer
2002-04-11 15:44:34 +00:00
parent 7131a41bde
commit 4428be70c3
10 changed files with 92 additions and 17 deletions
+2 -3
View File
@@ -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));
}
+14 -9
View File
@@ -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));
}
+7
View File
@@ -0,0 +1,7 @@
#ifndef epicsMathh
#define epicsMathh
#include <math.h>
#define isinf(D) 0
#endif /* epicsMathh */
+3 -1
View File
@@ -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 */
-3
View File
@@ -1,9 +1,6 @@
#ifndef epicsMathh
#define epicsMathh
#include <math.h>
#define epicsIsNAN(D) isnan(D)
#endif /* epicsMathh */
+10
View File
@@ -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 */
+3 -1
View File
@@ -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 */
+4
View File
@@ -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
+35
View File
@@ -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]);
}
+14
View File
@@ -0,0 +1,14 @@
/* epicsMathTestMain.cpp
*
* Author Marty Kraimer
*/
extern "C" {
void epicsMathTest ( void );
}
int main ( int , char *[] )
{
epicsMathTest ();
return 0;
}