/*
Copyright (C) 2015 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"
int main()
{
flint_rand_t state;
flint_printf("digits_round_inplace....");
fflush(stdout);
flint_randinit(state);
{
char s[30];
slong i, j, len, n;
flint_bitcnt_t shift;
fmpz_t inp, out, err, t;
arf_rnd_t rnd;
fmpz_init(inp);
fmpz_init(out);
fmpz_init(err);
fmpz_init(t);
for (i = 0; i < 100000 * arb_test_multiplier(); i++)
{
len = 1 + n_randint(state, 20);
n = 1 + n_randint(state, 20);
s[0] = (n_randint(state, 9) + '1');
for (j = 1; j < len; j++)
s[j] = (n_randint(state, 10) + '0');
s[len] = '\0';
fmpz_set_str(inp, s, 10);
switch (n_randint(state, 3))
{
case 0:
rnd = ARF_RND_DOWN;
break;
case 1:
rnd = ARF_RND_UP;
break;
default:
rnd = ARF_RND_NEAR;
break;
}
_arb_digits_round_inplace(s, &shift, err, n, rnd);
fmpz_set_str(out, s, 10);
fmpz_set_ui(t, 10);
fmpz_pow_ui(t, t, shift);
fmpz_mul(t, t, out);
fmpz_add(t, t, err);
if (!fmpz_equal(t, inp) || (rnd == ARF_RND_UP && fmpz_sgn(err) > 0))
{
flint_printf("FAIL!\n");
flint_printf("inp = "); fmpz_print(inp); flint_printf("\n\n");
flint_printf("shift = %wd\n\n", shift);
flint_printf("err = "); fmpz_print(err); flint_printf("\n\n");
flint_printf("out = "); fmpz_print(out); flint_printf("\n\n");
flint_printf(" t = "); fmpz_print(t); flint_printf("\n\n");
flint_abort();
}
}
fmpz_clear(inp);
fmpz_clear(out);
fmpz_clear(err);
fmpz_clear(t);
}
flint_randclear(state);
flint_cleanup();
flint_printf("PASS\n");
return EXIT_SUCCESS;
}