From f17ac39f29caa1ec26cc2940d196c96e20d2e2ff Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Tue, 25 Aug 2009 18:19:49 +0000 Subject: [PATCH] Disable divide by zero warnings on MSVC when generating NAN and INF. Use those values rather than calculating them independently. --- src/libCom/calc/calcPerform.c | 2 +- src/libCom/osi/epicsMath.cpp | 10 ++++++++++ src/rec/selRecord.c | 16 ++++------------ 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/libCom/calc/calcPerform.c b/src/libCom/calc/calcPerform.c index e242e1e3f..e074bbcbc 100644 --- a/src/libCom/calc/calcPerform.c +++ b/src/libCom/calc/calcPerform.c @@ -135,7 +135,7 @@ epicsShareFunc long if (itop) *ptop = (long) *ptop % itop; else - *ptop = 0.0 / itop; /* NaN */ + *ptop = epicsNAN; /* NaN */ break; case POWER: diff --git a/src/libCom/osi/epicsMath.cpp b/src/libCom/osi/epicsMath.cpp index c0e9d9068..6e53e62a0 100644 --- a/src/libCom/osi/epicsMath.cpp +++ b/src/libCom/osi/epicsMath.cpp @@ -9,6 +9,11 @@ #define epicsExportSharedSymbols #include +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable:4723) +#endif + static float makeNAN ( void ) { float a = 0, b = 0; @@ -25,3 +30,8 @@ extern "C" { epicsShareDef float epicsNAN = makeNAN(); epicsShareDef float epicsINF = makeINF(); } + +#ifdef _MSC_VER +#pragma warning(pop) +#endif + diff --git a/src/rec/selRecord.c b/src/rec/selRecord.c index e8f20f052..4eef2d79a 100644 --- a/src/rec/selRecord.c +++ b/src/rec/selRecord.c @@ -84,11 +84,6 @@ static void do_sel(selRecord *); static int fetch_values(selRecord *); static void monitor(selRecord *); -/* This needed to prevent the MS optimizer from barfing */ -static double divide(double num, double den) { return num / den; } - -static double NaN, Inf; - static long init_record(selRecord *prec, int pass) { @@ -98,9 +93,6 @@ static long init_record(selRecord *prec, int pass) if (pass==0) return(0); - NaN = divide(0.0, 0.0); - Inf = divide(1.0, 0.0); - /* get seln initial value if nvl is a constant*/ if (prec->nvl.type == CONSTANT ) { recGblInitConstantLink(&prec->nvl,DBF_USHORT,&prec->seln); @@ -109,7 +101,7 @@ static long init_record(selRecord *prec, int pass) plink = &prec->inpa; pvalue = &prec->a; for(i=0; itype==CONSTANT) { recGblInitConstantLink(plink,DBF_DOUBLE,pvalue); } @@ -365,7 +357,7 @@ static void do_sel(selRecord *prec) val = *(pvalue+prec->seln); break; case (selSELM_High_Signal): - val = -Inf; + val = -epicsINF; for (i = 0; i < SEL_MAX; i++,pvalue++){ if (!isnan(*pvalue) && val < *pvalue) { val = *pvalue; @@ -374,7 +366,7 @@ static void do_sel(selRecord *prec) } break; case (selSELM_Low_Signal): - val = Inf; + val = epicsINF; for (i = 0; i < SEL_MAX; i++,pvalue++){ if (!isnan(*pvalue) && val > *pvalue) { val = *pvalue; @@ -384,7 +376,7 @@ static void do_sel(selRecord *prec) break; case (selSELM_Median_Signal): count = 0; - order[0] = NaN; + order[0] = epicsNAN; for (i = 0; i < SEL_MAX; i++,pvalue++){ if (!isnan(*pvalue)){ /* Insertion sort */