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:
parent
100afbc149
commit
4ed44ab58e
@ -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 = \
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user