#include "libc/math/math.h"
#include "libc/str/str.h"

#if FLT_EVAL_METHOD == 0 || FLT_EVAL_METHOD == 1
#define EPS DBL_EPSILON
#elif FLT_EVAL_METHOD == 2
#define EPS LDBL_EPSILON
#endif

static const double_t toint = 1 / EPS;

double rint(double x) {
  int e, s;
  uint64_t i;
  double_t y;
  memcpy(&i, &x, 8);
  e = i >> 52 & 0x7ff;
  s = i >> 63;
  if (e >= 0x3ff + 52) {
    return x;
  }
  if (s) {
    y = x - toint + toint;
  } else {
    y = x + toint - toint;
  }
  if (y == 0) {
    return s ? -0.0 : 0;
  }
  return y;
}