#ifndef XSUM_H
#define XSUM_H
#include <stdlib.h>
#include <stdint.h>
#include <stddef.h>
typedef double xsum_flt;
typedef int64_t xsum_int;
typedef uint64_t xsum_uint;
typedef int_fast16_t xsum_expint;
#define XSUM_MANTISSA_BITS 52
#define XSUM_EXP_BITS 11
#define XSUM_MANTISSA_MASK \
(((xsum_int)1 << XSUM_MANTISSA_BITS) - 1)
#define XSUM_EXP_MASK \
((1 << XSUM_EXP_BITS) - 1)
#define XSUM_EXP_BIAS \
((1 << (XSUM_EXP_BITS-1)) - 1)
#define XSUM_SIGN_BIT \
(XSUM_MANTISSA_BITS + XSUM_EXP_BITS)
#define XSUM_SIGN_MASK \
((xsum_uint)1 << XSUM_SIGN_BIT)
#define XSUM_SCHUNK_BITS 64
typedef int64_t xsum_schunk;
#define XSUM_LOW_EXP_BITS 5
#define XSUM_LOW_EXP_MASK \
((1 << XSUM_LOW_EXP_BITS) - 1)
#define XSUM_HIGH_EXP_BITS \
(XSUM_EXP_BITS - XSUM_LOW_EXP_BITS)
#define XSUM_HIGH_EXP_MASK \
((1 << HIGH_EXP_BITS) - 1)
#define XSUM_SCHUNKS \
((1 << XSUM_HIGH_EXP_BITS) + 3)
#define XSUM_LOW_MANTISSA_BITS \
(1 << XSUM_LOW_EXP_BITS)
#define XSUM_HIGH_MANTISSA_BITS \
(XSUM_MANTISSA_BITS - XSUM_LOW_MANTISSA_BITS)
#define XSUM_LOW_MANTISSA_MASK \
(((xsum_int)1 << XSUM_LOW_MANTISSA_BITS) - 1)
#define XSUM_SMALL_CARRY_BITS \
((XSUM_SCHUNK_BITS-1) - XSUM_MANTISSA_BITS)
#define XSUM_SMALL_CARRY_TERMS \
((1 << XSUM_SMALL_CARRY_BITS) - 1)
typedef struct
{ xsum_schunk chunk[XSUM_SCHUNKS];
xsum_int Inf;
xsum_int NaN;
int adds_until_propagate;
} xsum_small_accumulator;
typedef ptrdiff_t xsum_length;
void xsum_small_init (xsum_small_accumulator *restrict);
void xsum_small_add1 (xsum_small_accumulator *restrict, xsum_flt);
void xsum_small_addv (xsum_small_accumulator *restrict,
const xsum_flt *restrict, xsum_length);
void xsum_small_add_sqnorm (xsum_small_accumulator *restrict,
const xsum_flt *restrict, xsum_length);
void xsum_small_add_dot (xsum_small_accumulator *restrict,
const xsum_flt *, const xsum_flt *, xsum_length);
void xsum_small_add_accumulator (xsum_small_accumulator *,
xsum_small_accumulator *);
void xsum_small_negate (xsum_small_accumulator *restrict);
xsum_flt xsum_small_round (xsum_small_accumulator *restrict);
xsum_flt xsum_small_div_unsigned (xsum_small_accumulator *restrict, unsigned);
xsum_flt xsum_small_div_int (xsum_small_accumulator *restrict, int);
extern int xsum_debug;
#endif