/*
Copyright (C) 2012 Fredrik Johansson
This file is part of Arb.
Arb is free software: you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License (LGPL) as published
by the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version. See .
*/
#include
#include "arb.h"
const char * testdata_floats[] = {
"0", /* repeated to test empty string later */
"0",
"0.0",
"0.",
".0",
"+0",
"+0.0",
"+0.",
" +.0 ",
"-0",
"-0.0",
"-0.",
"-.0",
" 0e3",
"0.0e3",
"0.e3",
" .0e3",
"+0e3",
"+0.0e3",
"+0.e3",
"+.0e3",
"-0e3",
"-0.0e3",
"-0.e3",
"-.0e3",
"0e+3",
"0.0e+3",
"0.e+3",
" .0e+3",
"+0e+3",
"+0.0e+3",
"+0.e+3",
"+.0e+3",
"-0E+3",
"-0.0E+3 ",
"-0.e+3",
"-.0e+3",
"0e-3",
"0.0e-3",
"0.e-3",
".0E-3",
"+0e-3",
"+0.0e-3",
"+0.E-3",
"+.0e-3",
"-0e-3",
"-0.0e-3",
"-0.e-3",
"-.0e-3",
"03.125",
"+03.125",
"-03.125",
"03.12500",
"+03.12500",
"-03.12500",
"03.125e+3",
"+03.125e+3",
" -03.125e+3 ",
"03.12500e+3",
"+03.12500e+3",
"-03.12500e+3",
"03.125e3",
"+03.125E3",
"-03.125e3",
"03.12500e3",
"+03.12500E3",
"-03.12500E3",
"25000.0e-2",
"-25000.0e-2",
" 25000.0000000000000000000e-2",
"-25000.0000000000000000000e-2",
" 000025000.0000000000000000000e-2 ",
"-000025000.0000000000000000000e-2",
"25000.e-2",
"-25000.e-2",
"12345.125",
"-12345.125",
"+12345.125",
"inf",
"-inf",
"+inf",
"Inf",
"-INF",
"+Inf",
"NAN",
"-NaN",
"+NAN",
NULL,
};
const char * testdata_invalid[] = {
"",
".",
"+.",
"-.",
".e+3",
"-.e+5",
"+.e-5",
"2+3",
"150a.25",
"-e+4",
"10.25x",
"10.3.5",
"125e3.6",
"125e-3.6",
"3.14 e+5",
"3.140 e3",
"3.14+e5",
"3.14e+ 5",
" 3.14e- 5",
"3.14e+-5",
"3.14e+/-5",
".0.",
"..",
":)",
" +/- ",
" 0 0",
" +/- EEE ",
"-3.5e+x5 +/-",
"4.7 +/- -3.5e+x5",
"4.7 +/-",
NULL,
};
int main()
{
flint_rand_t state;
arb_t t, u, v;
double x;
int error, bracket;
char tmp[256];
slong i, j;
flint_printf("set_str....");
fflush(stdout);
flint_randinit(state);
arb_init(t);
arb_init(u);
arb_init(v);
flint_randinit(state);
for (i = 0; testdata_floats[i] != NULL; i++)
{
arb_const_pi(t, 53);
error = arb_set_str(t, testdata_floats[i], 53);
x = strtod(testdata_floats[i], NULL);
if (x != x)
{
arb_indeterminate(u);
}
else
{
arf_set_d(arb_midref(u), x);
mag_zero(arb_radref(u));
}
if (error != 0 || !arb_equal(t, u))
{
flint_printf("FAIL (valid input): %s\n", testdata_floats[i]);
arb_printd(t, 15); flint_printf("\n");
arb_printd(u, 15); flint_printf("\n");
flint_abort();
}
}
for (i = 0; testdata_floats[i] != NULL; i++)
{
for (j = 0; testdata_floats[j] != NULL; j++)
{
for (bracket = 0; bracket < 2; bracket++)
{
arb_const_pi(t, 53);
bracket = n_randint(state, 2);
strcpy(tmp, "");
if (bracket)
strcat(tmp, "[");
/* allow empty string for midpoint */
strcat(tmp, (i == 0) ? "" : testdata_floats[i]);
strcat(tmp, "+/-");
strcat(tmp, testdata_floats[j]);
if (bracket)
strcat(tmp, "]");
error = arb_set_str(t, tmp, 53);
x = strtod((i == 0) ? "0" : testdata_floats[i], NULL);
if (x != x)
{
arb_indeterminate(u);
}
else
{
arf_set_d(arb_midref(u), x);
mag_zero(arb_radref(u));
}
x = strtod(testdata_floats[j], NULL);
arf_set_d(arb_midref(v), x);
mag_zero(arb_radref(v));
arb_abs(v, v);
arb_add_error(u, v);
if (error != 0 || !arb_equal(t, u))
{
flint_printf("FAIL (valid input): %s\n", tmp);
arb_printd(t, 15); flint_printf("\n");
arb_printd(u, 15); flint_printf("\n");
flint_abort();
}
}
}
}
for (i = 0; testdata_invalid[i] != NULL; i++)
{
arb_const_pi(t, 53);
error = arb_set_str(t, testdata_invalid[i], 53);
if (error == 0)
{
flint_printf("FAIL (invalid input): %s\n", testdata_invalid[i]);
arb_printd(t, 15); flint_printf("\n");
flint_abort();
}
}
for (i = 0; testdata_invalid[i] != NULL; i++)
{
for (j = 0; testdata_invalid[j] != NULL; j++)
{
for (bracket = 0; bracket < 2; bracket++)
{
arb_const_pi(t, 53);
bracket = n_randint(state, 2);
strcpy(tmp, "");
if (bracket)
strcat(tmp, "[");
strcat(tmp, testdata_invalid[i]);
strcat(tmp, "+/-");
strcat(tmp, testdata_invalid[j]);
if (bracket)
strcat(tmp, "]");
error = arb_set_str(t, tmp, 53);
if (error == 0)
{
flint_printf("FAIL (invalid input): %s\n", tmp);
arb_printd(t, 15); flint_printf("\n");
flint_abort();
}
}
}
}
arb_clear(t);
arb_clear(u);
arb_clear(v);
flint_randclear(state);
flint_cleanup();
flint_printf("PASS\n");
return EXIT_SUCCESS;
}