diff --git a/Makefile.am b/Makefile.am index 5c3553d9..5d96b7a5 100644 --- a/Makefile.am +++ b/Makefile.am @@ -227,10 +227,9 @@ ps_pscommand_SOURCES = \ lib/fileutils.c # Test programs not used by dejagnu but run directly -# Remove strtod tests due to fp inequality -#TESTS = \ -# lib/test_strtod_nol -#check_PROGRAMS = $(TESTS) +TESTS = \ + lib/test_strtod_nol +check_PROGRAMS = $(TESTS) # Test programs required for dejagnu noinst_PROGRAMS = \ diff --git a/include/strutils.h b/include/strutils.h index 85a61920..a5a15c90 100644 --- a/include/strutils.h +++ b/include/strutils.h @@ -7,6 +7,6 @@ extern long strtol_or_err(const char *str, const char *errmesg); extern double strtod_or_err(const char *str, const char *errmesg); -double strtod_nol_or_err(char *str, const char *errmesg); +extern double strtod_nol_or_err(char *str, const char *errmesg); #endif diff --git a/lib/strutils.c b/lib/strutils.c index e5245db0..e0632c45 100644 --- a/lib/strutils.c +++ b/lib/strutils.c @@ -20,6 +20,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ +#include +#include #include #include @@ -71,9 +73,9 @@ double strtod_or_err(const char *str, const char *errmesg) */ double strtod_nol_or_err(char *str, const char *errmesg) { - double num; + long double num; const char *cp, *radix; - double mult; + long double mult; int negative = 0; if (str != NULL && *str != '\0') { @@ -95,29 +97,29 @@ double strtod_nol_or_err(char *str, const char *errmesg) mult=0.1; while(isdigit(*radix)) { radix++; - mult *= 10; + mult *= 10.0; } while(isdigit(*cp)) { - num += (*cp - '0') * mult; - mult /= 10; + num += (long double)(*cp - '0') * mult; + mult /= 10.0; cp++; } /* got the integers */ if (*cp == '\0') - return (negative?-num:num); + return (double)(negative?-num:num); if (*cp != '.' && *cp != ',') error(EXIT_FAILURE, EINVAL, "%s: '%s'", errmesg, str); cp++; mult = 0.1; while(isdigit(*cp)) { - num += (*cp - '0') * mult; - mult /= 10; + num += (long double)(*cp - '0') * mult; + mult /= 10.0; cp++; } if (*cp == '\0') - return (negative?-num:num); + return (double)(negative?-num:num); } error(EXIT_FAILURE, errno, "%s: '%s'", errmesg, str); - return 0; + return (double)0; } diff --git a/lib/test_strtod_nol.c b/lib/test_strtod_nol.c index 0be798c2..736768a2 100644 --- a/lib/test_strtod_nol.c +++ b/lib/test_strtod_nol.c @@ -1,4 +1,5 @@ - +#include +#include #include #include #include "strutils.h" @@ -33,8 +34,8 @@ int main(int argc, char *argv[]) double val; for(i=0; tests[i].string != NULL; i++) { - if(strtod_nol_or_err(tests[i].string, "Cannot parse number") != - tests[i].result) { + val = strtod_nol_or_err(tests[i].string, "Cannot parse number"); + if(fabs(tests[i].result - val) > DBL_EPSILON) { fprintf(stderr, "FAIL: strtod_nol_or_err(\"%s\") != %f\n", tests[i].string, tests[i].result); return EXIT_FAILURE;