# d_vec.h – double precision vectors¶

## Memory management¶

double *_d_vec_init(slong len)

Returns an initialised vector of doubles of given length. The entries are not zeroed.

void _d_vec_clear(double *vec)

Frees the space allocated for vec.

## Randomisation¶

void _d_vec_randtest(double *f, flint_rand_t state, slong len, slong minexp, slong maxexp)

Sets the entries of a vector of the given length to random signed numbers with exponents between minexp and maxexp or zero.

## Assignment and basic manipulation¶

void _d_vec_set(double *vec1, const double *vec2, slong len2)

Makes a copy of (vec2, len2) into vec1.

void _d_vec_zero(double *vec, slong len)

Zeros the entries of (vec, len).

## Comparison¶

int _d_vec_equal(const double *vec1, const double *vec2, slong len)

Compares two vectors of the given length and returns $$1$$ if they are equal, otherwise returns $$0$$.

int _d_vec_is_zero(const double *vec, slong len)

Returns $$1$$ if (vec, len) is zero, and $$0$$ otherwise.

int _d_vec_is_approx_zero(const double *vec, slong len, double eps)

Returns $$1$$ if the entries of (vec, len) are zero to within eps, and $$0$$ otherwise.

int _d_vec_approx_equal(const double *vec1, const double *vec2, slong len, double eps)

Compares two vectors of the given length and returns $$1$$ if their entries are within eps of each other, otherwise returns $$0$$.

## Arithmetic¶

void _d_vec_add(double *res, const double *vec1, const double *vec2, slong len2)

Sets (res, len2) to the sum of (vec1, len2) and (vec2, len2).

void _d_vec_sub(double *res, const double *vec1, const double *vec2, slong len2)

Sets (res, len2) to (vec1, len2) minus (vec2, len2).

void _d_vec_mul_2exp(double *res, const double *vec, slong len, int e)

Sets (res, len) to (vec, len) multiplied by $$2^e$$.

## Dot product and norm¶

double _d_vec_dot(const double *vec1, const double *vec2, slong len2)

Returns the dot product of (vec1, len2) and (vec2, len2).

double _d_vec_norm(const double *vec, slong len)

Returns the square of the Euclidean norm of (vec, len).

double _d_vec_dot_heuristic(const double *vec1, const double *vec2, slong len2, double *err)

Returns the dot product of (vec1, len2) and (vec2, len2) by adding up the positive and negative products, and doing a single subtraction of the two sums at the end. err is a pointer to a double in which an error bound for the operation will be stored.

double _d_vec_dot_thrice(const double *vec1, const double *vec2, slong len2, double *err)

Returns the dot product of (vec1, len2) and (vec2, len2) using error-free floating point sums and products to compute the dot product with three times (thrice) the working precision. err is a pointer to a double in which an error bound for the operation will be stored.

This implements the algorithm of Ogita-Rump-Oishi. See http://www.ti3.tuhh.de/paper/rump/OgRuOi05.pdf.