From 4ed44ab58e27a9a09902b9c5b49df484842b6c9a Mon Sep 17 00:00:00 2001 From: Dr. Werner Fink Date: Wed, 13 Jul 2016 20:08:51 +1000 Subject: [PATCH] misc: fix strtod_nol_err tests A better way of implementing the string to double conversion and a better way of testing it. Signed-off-by: Craig Small --- include/strutils.h | 2 +- lib/strutils.c | 22 ++++++++++++---------- lib/test_strtod_nol.c | 7 ++++--- 4 files changed, 20 insertions(+), 18 deletions(-) diff --git a/include/strutils.h b/include/strutils.h index 85a6192..a5a15c9 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 e5245db..e0632c4 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 0be798c..736768a 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; -- libgit2 0.26.0