#include <limits.h>
#include <stdlib.h>
#include <math.h>
+#include <float.h>
#include "parse.h"
#include "debug.h"
#include "options.h"
#include "minmax.h"
+#include "lib/ieee754.h"
static struct fio_option *fio_options;
extern unsigned int fio_get_kb_base(void *);
int (*logger)(const char *format, ...))
{
if (o->type == FIO_OPT_FLOAT_LIST){
- if (isnan(o->minfp) && isnan(o->maxfp))
+ if (o->minfp == DBL_MIN && o->maxfp == DBL_MAX)
return;
logger("%20s: min=%f", "range", o->minfp);
- if (!isnan(o->maxfp))
+ if (o->maxfp != DBL_MAX)
logger(", max=%f", o->maxfp);
logger("\n");
} else {
int first, int more, int curr)
{
int il, *ilp;
- double* flp;
+ fio_fp64_t *flp;
long long ull, *ullp;
long ul1, ul2;
double uf;
break;
}
case FIO_OPT_FLOAT_LIST: {
+ char *cp2;
if (first) {
- ul2 = 1;
+ /*
+ ** Initialize precision to 0 and zero out list
+ ** in case specified list is shorter than default
+ */
+ ul2 = 0;
ilp = td_var(data, o->off2);
*ilp = ul2;
+
+ flp = td_var(data, o->off1);
+ for(i = 0; i < o->maxlen; i++)
+ flp[i].u.f = 0.0;
}
if (curr >= o->maxlen) {
log_err("the list exceeding max length %d\n",
o->maxlen);
return 1;
}
- if (!str_to_float(ptr, &uf)){
+ if (!str_to_float(ptr, &uf)) {
log_err("not a floating point value: %s\n", ptr);
return 1;
}
- if (!isnan(o->maxfp) && uf > o->maxfp) {
+ if (uf > o->maxfp) {
log_err("value out of range: %f"
" (range max: %f)\n", uf, o->maxfp);
return 1;
}
- if (!isnan(o->minfp) && uf < o->minfp) {
+ if (uf < o->minfp) {
log_err("value out of range: %f"
" (range min: %f)\n", uf, o->minfp);
return 1;
}
flp = td_var(data, o->off1);
- flp[curr] = uf;
+ flp[curr].u.f = uf;
+
+ /*
+ ** Calculate precision for output by counting
+ ** number of digits after period. Find first
+ ** period in entire remaining list each time
+ */
+ cp2 = strchr(ptr, '.');
+ if (cp2 != NULL) {
+ int len = 0;
+
+ while (*++cp2 != '\0' && *cp2 >= '0' && *cp2 <= '9')
+ len++;
+
+ ilp = td_var(data, o->off2);
+ if (len > *ilp)
+ *ilp = len;
+ }
break;
}
o->maxval = UINT_MAX;
}
if (o->type == FIO_OPT_FLOAT_LIST) {
-#ifndef NAN
-#define NAN __builtin_nanf("")
-#endif
- o->minfp = NAN;
- o->maxfp = NAN;
+ o->minfp = DBL_MIN;
+ o->maxfp = DBL_MAX;
}
if (o->type == FIO_OPT_STR_SET && o->def) {
log_err("Option %s: string set option with"