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 <csmall@enc.com.au>
This commit is contained in:
Dr. Werner Fink 2016-07-13 20:08:51 +10:00 committed by Craig Small
parent 100afbc149
commit 4ed44ab58e
4 changed files with 20 additions and 18 deletions

View File

@ -227,10 +227,9 @@ ps_pscommand_SOURCES = \
lib/fileutils.c lib/fileutils.c
# Test programs not used by dejagnu but run directly # Test programs not used by dejagnu but run directly
# Remove strtod tests due to fp inequality TESTS = \
#TESTS = \ lib/test_strtod_nol
# lib/test_strtod_nol check_PROGRAMS = $(TESTS)
#check_PROGRAMS = $(TESTS)
# Test programs required for dejagnu # Test programs required for dejagnu
noinst_PROGRAMS = \ noinst_PROGRAMS = \

View File

@ -7,6 +7,6 @@
extern long strtol_or_err(const char *str, const char *errmesg); extern long strtol_or_err(const char *str, const char *errmesg);
extern double strtod_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 #endif

View File

@ -20,6 +20,8 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/ */
#include <float.h>
#include <math.h>
#include <stdlib.h> #include <stdlib.h>
#include <ctype.h> #include <ctype.h>
@ -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 strtod_nol_or_err(char *str, const char *errmesg)
{ {
double num; long double num;
const char *cp, *radix; const char *cp, *radix;
double mult; long double mult;
int negative = 0; int negative = 0;
if (str != NULL && *str != '\0') { if (str != NULL && *str != '\0') {
@ -95,29 +97,29 @@ double strtod_nol_or_err(char *str, const char *errmesg)
mult=0.1; mult=0.1;
while(isdigit(*radix)) { while(isdigit(*radix)) {
radix++; radix++;
mult *= 10; mult *= 10.0;
} }
while(isdigit(*cp)) { while(isdigit(*cp)) {
num += (*cp - '0') * mult; num += (long double)(*cp - '0') * mult;
mult /= 10; mult /= 10.0;
cp++; cp++;
} }
/* got the integers */ /* got the integers */
if (*cp == '\0') if (*cp == '\0')
return (negative?-num:num); return (double)(negative?-num:num);
if (*cp != '.' && *cp != ',') if (*cp != '.' && *cp != ',')
error(EXIT_FAILURE, EINVAL, "%s: '%s'", errmesg, str); error(EXIT_FAILURE, EINVAL, "%s: '%s'", errmesg, str);
cp++; cp++;
mult = 0.1; mult = 0.1;
while(isdigit(*cp)) { while(isdigit(*cp)) {
num += (*cp - '0') * mult; num += (long double)(*cp - '0') * mult;
mult /= 10; mult /= 10.0;
cp++; cp++;
} }
if (*cp == '\0') if (*cp == '\0')
return (negative?-num:num); return (double)(negative?-num:num);
} }
error(EXIT_FAILURE, errno, "%s: '%s'", errmesg, str); error(EXIT_FAILURE, errno, "%s: '%s'", errmesg, str);
return 0; return (double)0;
} }

View File

@ -1,4 +1,5 @@
#include <float.h>
#include <math.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include "strutils.h" #include "strutils.h"
@ -33,8 +34,8 @@ int main(int argc, char *argv[])
double val; double val;
for(i=0; tests[i].string != NULL; i++) { for(i=0; tests[i].string != NULL; i++) {
if(strtod_nol_or_err(tests[i].string, "Cannot parse number") != val = strtod_nol_or_err(tests[i].string, "Cannot parse number");
tests[i].result) { if(fabs(tests[i].result - val) > DBL_EPSILON) {
fprintf(stderr, "FAIL: strtod_nol_or_err(\"%s\") != %f\n", fprintf(stderr, "FAIL: strtod_nol_or_err(\"%s\") != %f\n",
tests[i].string, tests[i].result); tests[i].string, tests[i].result);
return EXIT_FAILURE; return EXIT_FAILURE;