From ff08561ba03088d4a30b79cc0988dce2a248bca0 Mon Sep 17 00:00:00 2001 From: Marty Kraimer Date: Mon, 5 Apr 2004 13:17:30 +0000 Subject: [PATCH] fix double to float conversion bug --- src/db/dbConvert.c | 23 +++++----------------- src/db/dbFastLinkConv.c | 15 ++------------- src/db/db_access.c | 42 +++++++++++++++-------------------------- 3 files changed, 22 insertions(+), 58 deletions(-) diff --git a/src/db/dbConvert.c b/src/db/dbConvert.c index 7c187a7a7..99170dad8 100644 --- a/src/db/dbConvert.c +++ b/src/db/dbConvert.c @@ -22,6 +22,7 @@ #include #include +#include "epicsConvert.h" #include "dbDefs.h" #include "errlog.h" #include "cvtFast.h" @@ -37,20 +38,6 @@ #include "recGbl.h" #include "dbConvert.h" -/*safe double to float conversion*/ -static void safeDoubleToFloat(double *pd,float *pf) -{ - double abs = fabs(*pd); - if(*pd==0.0) { - *pf = 0.0; - } else if(abs>=FLT_MAX) { - if(*pd>0.0) *pf = FLT_MAX; else *pf = -FLT_MAX; - } else if(abs<=FLT_MIN) { - if(*pd>0.0) *pf = FLT_MIN; else *pf = -FLT_MIN; - } else { - *pf = *pd; - } -} /* DATABASE ACCESS GET CONVERSION SUPPORT */ static long getStringString ( @@ -1900,12 +1887,12 @@ static long getDoubleFloat( double *psrc=(double *)(paddr->pfield); if(nRequest==1 && offset==0) { - safeDoubleToFloat(psrc,pbuffer); + *pbuffer = epicsConvertDoubleToFloat(*psrc); return(0); } psrc += offset; while (nRequest) { - safeDoubleToFloat(psrc,pbuffer); + *pbuffer = epicsConvertDoubleToFloat(*psrc); ++psrc; ++pbuffer; if(++offset==no_elements) psrc=(double *)paddr->pfield; nRequest--; @@ -4110,12 +4097,12 @@ static long putDoubleFloat( float *pdest=(float *)(paddr->pfield); if(nRequest==1 && offset==0) { - safeDoubleToFloat(pbuffer,pdest); + *pdest = epicsConvertDoubleToFloat(*pbuffer); return(0); } pdest += offset; while (nRequest) { - safeDoubleToFloat(pbuffer,pdest); + *pdest = epicsConvertDoubleToFloat(*pbuffer); ++pbuffer; ++pdest; if(++offset==no_elements) pdest=(float *)paddr->pfield; nRequest--; diff --git a/src/db/dbFastLinkConv.c b/src/db/dbFastLinkConv.c index 27e8c016d..adf312d1e 100644 --- a/src/db/dbFastLinkConv.c +++ b/src/db/dbFastLinkConv.c @@ -20,6 +20,7 @@ #include #include +#include "epicsConvert.h" #include "dbDefs.h" #include "errlog.h" #include "cvtFast.h" @@ -919,19 +920,7 @@ static long cvt_d_f( double *from, float *to, struct dbAddr *paddr) -{ - double abs = fabs(*from); - if(*from==0.0) { - *to = 0.0; - } else if(abs>=FLT_MAX) { - if(*from>0.0) *to = FLT_MAX; else *to = -FLT_MAX; - } else if(abs<=FLT_MIN) { - if(*from>0.0) *to = FLT_MIN; else *to = -FLT_MIN; - } else { - *to = *from; - } - return(0); -} +{ *to = epicsConvertDoubleToFloat(*from); return 0;} /* Convert Double to Double */ static long cvt_d_d( diff --git a/src/db/db_access.c b/src/db/db_access.c index 0b8188c1f..ca09117b9 100644 --- a/src/db/db_access.c +++ b/src/db/db_access.c @@ -29,6 +29,7 @@ #include #include +#include "epicsConvert.h" #include "dbDefs.h" #include "errlog.h" #include "ellLib.h" @@ -117,19 +118,6 @@ extern unsigned short dbDBRnewToDBRold[DBR_ENUM+1]; #ifndef MAX_STRING_SIZE #define MAX_STRING_SIZE 40 #endif - -/*safe double to float conversion*/ -static void safeDoubleToFloat(double *pd,float *pf) -{ - double abs = fabs(*pd); - if(abs>=FLT_MAX) { - if(*pd>0.0) *pf = FLT_MAX; else *pf = -FLT_MAX; - } else if(abs<=FLT_MIN) { - if(*pd>0.0) *pf = FLT_MIN; else *pf = -FLT_MIN; - } else { - *pf = *pd; - } -} /* From $cs/dblib/src/dbiocsubs.c * subroutines @@ -686,12 +674,12 @@ void *pfl pold->precision = new.precision; strncpy(pold->units,new.units,MAX_UNITS_SIZE); pold->units[MAX_UNITS_SIZE-1] = '\0'; - safeDoubleToFloat(&new.upper_disp_limit,&pold->upper_disp_limit); - safeDoubleToFloat(&new.lower_disp_limit,&pold->lower_disp_limit); - safeDoubleToFloat(&new.upper_alarm_limit,&pold->upper_alarm_limit); - safeDoubleToFloat(&new.upper_warning_limit,&pold->upper_warning_limit); - safeDoubleToFloat(&new.lower_warning_limit,&pold->lower_warning_limit); - safeDoubleToFloat(&new.lower_alarm_limit,&pold->lower_alarm_limit); + pold->upper_disp_limit = epicsConvertDoubleToFloat(new.upper_disp_limit); + pold->lower_disp_limit = epicsConvertDoubleToFloat(new.lower_disp_limit); + pold->upper_alarm_limit = epicsConvertDoubleToFloat(new.upper_alarm_limit); + pold->lower_alarm_limit = epicsConvertDoubleToFloat(new.lower_alarm_limit); + pold->upper_warning_limit = epicsConvertDoubleToFloat(new.upper_warning_limit); + pold->lower_warning_limit = epicsConvertDoubleToFloat(new.lower_warning_limit); options=0; nRequest=no_elements; status = dbGetField(paddr,DBR_FLOAT,&(pold->value),&options, @@ -859,14 +847,14 @@ void *pfl pold->precision = new.precision; strncpy(pold->units,new.units,MAX_UNITS_SIZE); pold->units[MAX_UNITS_SIZE-1] = '\0'; - safeDoubleToFloat(&new.upper_disp_limit,&pold->upper_disp_limit); - safeDoubleToFloat(&new.lower_disp_limit,&pold->lower_disp_limit); - safeDoubleToFloat(&new.upper_alarm_limit,&pold->upper_alarm_limit); - safeDoubleToFloat(&new.upper_warning_limit,&pold->upper_warning_limit); - safeDoubleToFloat(&new.lower_warning_limit,&pold->lower_warning_limit); - safeDoubleToFloat(&new.lower_alarm_limit,&pold->lower_alarm_limit); - safeDoubleToFloat(&new.upper_ctrl_limit,&pold->upper_ctrl_limit); - safeDoubleToFloat(&new.lower_ctrl_limit,&pold->lower_ctrl_limit); + pold->upper_disp_limit = epicsConvertDoubleToFloat(new.upper_disp_limit); + pold->lower_disp_limit = epicsConvertDoubleToFloat(new.lower_disp_limit); + pold->upper_alarm_limit = epicsConvertDoubleToFloat(new.upper_alarm_limit); + pold->lower_alarm_limit = epicsConvertDoubleToFloat(new.lower_alarm_limit); + pold->upper_warning_limit = epicsConvertDoubleToFloat(new.upper_warning_limit); + pold->lower_warning_limit = epicsConvertDoubleToFloat(new.lower_warning_limit); + pold->upper_ctrl_limit = epicsConvertDoubleToFloat(new.upper_ctrl_limit); + pold->lower_ctrl_limit = epicsConvertDoubleToFloat(new.lower_ctrl_limit); options=0; nRequest=no_elements; status = dbGetField(paddr,DBR_FLOAT,&(pold->value),&options,