{
MPFR_DECL_INIT(mx, 53);
- mpfr_set_d(mx, t->x, MPFR_RNDN);
- t->y = mpfr_get_exp(mx) - 1;
t->dy = 0;
t->e = 0;
+ if (t->x == 0) {
+ t->y = -INFINITY;
+ t->e |= DIVBYZERO;
+ return 0;
+ }
+ if (isinf(t->x)) {
+ t->y = INFINITY;
+ return 0;
+ }
+ if (isnan(t->x)) {
+ t->y = t->x;
+ return 0;
+ }
+ mpfr_set_d(mx, t->x, MPFR_RNDN);
+ t->y = mpfr_get_exp(mx) - 1;
return 0;
}
int mplogbf(struct t *t)
{
MPFR_DECL_INIT(mx, 24);
- mpfr_set_flt(mx, t->x, MPFR_RNDN);
- t->y = mpfr_get_exp(mx) - 1;
t->dy = 0;
t->e = 0;
+ if (t->x == 0) {
+ t->y = -INFINITY;
+ t->e |= DIVBYZERO;
+ return 0;
+ }
+ if (isinf(t->x)) {
+ t->y = INFINITY;
+ return 0;
+ }
+ if (isnan(t->x)) {
+ t->y = t->x;
+ return 0;
+ }
+ mpfr_set_flt(mx, t->x, MPFR_RNDN);
+ t->y = mpfr_get_exp(mx) - 1;
return 0;
}
int mplogbl(struct t *t)
{
MPFR_DECL_INIT(mx, 64);
- mpfr_set_ld(mx, t->x, MPFR_RNDN);
- t->y = mpfr_get_exp(mx) - 1;
t->dy = 0;
t->e = 0;
+ if (t->x == 0) {
+ t->y = -INFINITY;
+ t->e |= DIVBYZERO;
+ return 0;
+ }
+ if (isinf(t->x)) {
+ t->y = INFINITY;
+ return 0;
+ }
+ if (isnan(t->x)) {
+ t->y = t->x;
+ return 0;
+ }
+ mpfr_set_ld(mx, t->x, MPFR_RNDN);
+ t->y = mpfr_get_exp(mx) - 1;
return 0;
}
int mpnearbyint(struct t *t) { return mpd1(t, wrap_nearbyint) || (t->e&=~INEXACT, 0); }
int mptanh(struct t *t) { return mpd1(t, mpfr_tanh); }
int mptanhf(struct t *t) { return mpf1(t, mpfr_tanh); }
int mptanhl(struct t *t) { return mpl1(t, mpfr_tanh); }
+// TODO: tgamma(2) raises wrong flags
int mptgamma(struct t *t) { return mpd1(t, mpfr_gamma); }
int mptgammaf(struct t *t) { return mpf1(t, mpfr_gamma); }
int mptgammal(struct t *t) { return mpl1(t, mpfr_gamma); }
mpfr_set_d(mx, t->x, MPFR_RNDN);
t->i = mpfr_get_exp(mx) - 1;
t->e = 0;
+ if (isinf(t->x) || isnan(t->x) || t->x == 0)
+ t->e = INVALID;
return 0;
}
int mpilogbf(struct t *t)
mpfr_set_flt(mx, t->x, MPFR_RNDN);
t->i = mpfr_get_exp(mx) - 1;
t->e = 0;
+ if (isinf(t->x) || isnan(t->x) || t->x == 0)
+ t->e = INVALID;
return 0;
}
int mpilogbl(struct t *t)
mpfr_set_ld(mx, t->x, MPFR_RNDN);
t->i = mpfr_get_exp(mx) - 1;
t->e = 0;
+ if (isinf(t->x) || isnan(t->x) || t->x == 0)
+ t->e = INVALID;
return 0;
}
return r;
t->y2 = t->y;
t->dy2 = t->dy;
- e = t->e;
+ e = t->e & ~INEXACT;
r = mpd1(t, mpfr_frac);
t->e |= e;
return r;
return r;
t->y2 = t->y;
t->dy2 = t->dy;
- e = t->e;
+ e = t->e & ~INEXACT;
r = mpf1(t, mpfr_frac);
t->e |= e;
return r;
return r;
t->y2 = t->y;
t->dy2 = t->dy;
- e = t->e;
+ e = t->e & ~INEXACT;
r = mpl1(t, mpfr_frac);
t->e |= e;
return r;