X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fmath%2Flrint.c;h=0d4bf854bccafb2f94433a6a0ac68c398288f7f3;hb=f3f0ff4782fc90bd0f3e48fd541ee431f76aaed1;hp=0e019a6deaf1d1b728297994c2d77a9c62a0ce0a;hpb=ce441c1b09323e5bce2545230414c069a0c706ea;p=libc-test diff --git a/src/math/lrint.c b/src/math/lrint.c index 0e019a6..0d4bf85 100644 --- a/src/math/lrint.c +++ b/src/math/lrint.c @@ -1,166 +1,41 @@ -#include "test.h" -#include #include -#include #include -#include -#include "fenvutil.h" +#include "util.h" + +static struct d_i t[] = { +#include "sanity/lrint.h" +#include "special/lrint.h" -static struct { - int round; - double x; - long n; - int except; -} t[] = { -FE_TONEAREST, 0x0p+0, 0, 0, -FE_DOWNWARD, 0x0p+0, 0, 0, -FE_UPWARD, 0x0p+0, 0, 0, -FE_TOWARDZERO, 0x0p+0, 0, 0, -FE_TONEAREST, 0x1p-2, 0, FE_INEXACT, -FE_DOWNWARD, 0x1p-2, 0, FE_INEXACT, -FE_UPWARD, 0x1p-2, 1, FE_INEXACT, -FE_TOWARDZERO, 0x1p-2, 0, FE_INEXACT, -FE_TONEAREST, -0x1p-2, 0, FE_INEXACT, -FE_DOWNWARD, -0x1p-2, -1, FE_INEXACT, -FE_UPWARD, -0x1p-2, 0, FE_INEXACT, -FE_TOWARDZERO, -0x1p-2, 0, FE_INEXACT, -FE_TONEAREST, 0x1p-1, 0, FE_INEXACT, -FE_DOWNWARD, 0x1p-1, 0, FE_INEXACT, -FE_UPWARD, 0x1p-1, 1, FE_INEXACT, -FE_TOWARDZERO, 0x1p-1, 0, FE_INEXACT, -FE_TONEAREST, -0x1p-1, 0, FE_INEXACT, -FE_DOWNWARD, -0x1p-1, -1, FE_INEXACT, -FE_UPWARD, -0x1p-1, 0, FE_INEXACT, -FE_TOWARDZERO, -0x1p-1, 0, FE_INEXACT, -FE_TONEAREST, 0x1.8p-1, 1, FE_INEXACT, -FE_DOWNWARD, 0x1.8p-1, 0, FE_INEXACT, -FE_UPWARD, 0x1.8p-1, 1, FE_INEXACT, -FE_TOWARDZERO, 0x1.8p-1, 0, FE_INEXACT, -FE_TONEAREST, -0x1.8p-1, -1, FE_INEXACT, -FE_DOWNWARD, -0x1.8p-1, -1, FE_INEXACT, -FE_UPWARD, -0x1.8p-1, 0, FE_INEXACT, -FE_TOWARDZERO, -0x1.8p-1, 0, FE_INEXACT, -FE_TONEAREST, 0x1p+0, 1, 0, -FE_DOWNWARD, 0x1p+0, 1, 0, -FE_UPWARD, 0x1p+0, 1, 0, -FE_TOWARDZERO, 0x1p+0, 1, 0, -FE_TONEAREST, -0x1p+0, -1, 0, -FE_DOWNWARD, -0x1p+0, -1, 0, -FE_UPWARD, -0x1p+0, -1, 0, -FE_TOWARDZERO, -0x1p+0, -1, 0, -FE_TONEAREST, 0x1.4p+0, 1, FE_INEXACT, -FE_DOWNWARD, 0x1.4p+0, 1, FE_INEXACT, -FE_UPWARD, 0x1.4p+0, 2, FE_INEXACT, -FE_TOWARDZERO, 0x1.4p+0, 1, FE_INEXACT, -FE_TONEAREST, -0x1.4p+0, -1, FE_INEXACT, -FE_DOWNWARD, -0x1.4p+0, -2, FE_INEXACT, -FE_UPWARD, -0x1.4p+0, -1, FE_INEXACT, -FE_TOWARDZERO, -0x1.4p+0, -1, FE_INEXACT, -FE_TONEAREST, 0x1p+30, 1073741824, 0, -FE_DOWNWARD, 0x1p+30, 1073741824, 0, -FE_UPWARD, 0x1p+30, 1073741824, 0, -FE_TOWARDZERO, 0x1p+30, 1073741824, 0, -FE_TONEAREST, -0x1p+30, -1073741824, 0, -FE_DOWNWARD, -0x1p+30, -1073741824, 0, -FE_UPWARD, -0x1p+30, -1073741824, 0, -FE_TOWARDZERO, -0x1p+30, -1073741824, 0, -FE_TONEAREST, 0x1.fffffffcp+30, 2147483647, 0, -FE_DOWNWARD, 0x1.fffffffcp+30, 2147483647, 0, -FE_UPWARD, 0x1.fffffffcp+30, 2147483647, 0, -FE_TOWARDZERO, 0x1.fffffffcp+30, 2147483647, 0, -FE_TONEAREST, -0x1.fffffffcp+30, -2147483647, 0, -FE_DOWNWARD, -0x1.fffffffcp+30, -2147483647, 0, -FE_UPWARD, -0x1.fffffffcp+30, -2147483647, 0, -FE_TOWARDZERO, -0x1.fffffffcp+30, -2147483647, 0, -FE_TONEAREST, 0x1p+31, 0, FE_INVALID, -FE_DOWNWARD, 0x1p+31, 0, FE_INVALID, -FE_UPWARD, 0x1p+31, 0, FE_INVALID, -FE_TOWARDZERO, 0x1p+31, 0, FE_INVALID, -FE_TONEAREST, -0x1p+31, -2147483648, 0, -FE_DOWNWARD, -0x1p+31, -2147483648, 0, -FE_UPWARD, -0x1p+31, -2147483648, 0, -FE_TOWARDZERO, -0x1p+31, -2147483648, 0, -FE_TONEAREST, 0x1.00000002p+31, 0, FE_INVALID, -FE_DOWNWARD, 0x1.00000002p+31, 0, FE_INVALID, -FE_UPWARD, 0x1.00000002p+31, 0, FE_INVALID, -FE_TOWARDZERO, 0x1.00000002p+31, 0, FE_INVALID, -FE_TONEAREST, -0x1.00000002p+31, 0, FE_INVALID, -FE_DOWNWARD, -0x1.00000002p+31, 0, FE_INVALID, -FE_UPWARD, -0x1.00000002p+31, 0, FE_INVALID, -FE_TOWARDZERO, -0x1.00000002p+31, 0, FE_INVALID, -FE_TONEAREST, 0x1.fffffffep+30, 0, FE_INVALID, -FE_DOWNWARD, 0x1.fffffffep+30, 2147483647, FE_INEXACT, -FE_UPWARD, 0x1.fffffffep+30, 0, FE_INVALID, -FE_TOWARDZERO, 0x1.fffffffep+30, 2147483647, FE_INEXACT, -FE_TONEAREST, -0x1.fffffffep+30, -2147483648, FE_INEXACT, -FE_DOWNWARD, -0x1.fffffffep+30, -2147483648, FE_INEXACT, -FE_UPWARD, -0x1.fffffffep+30, -2147483647, FE_INEXACT, -FE_TOWARDZERO, -0x1.fffffffep+30, -2147483647, FE_INEXACT, -FE_TONEAREST, 0x1.00000001p+31, 0, FE_INVALID, -FE_DOWNWARD, 0x1.00000001p+31, 0, FE_INVALID, -FE_UPWARD, 0x1.00000001p+31, 0, FE_INVALID, -FE_TOWARDZERO, 0x1.00000001p+31, 0, FE_INVALID, -FE_TONEAREST, -0x1.00000001p+31, -2147483648, FE_INEXACT, -FE_DOWNWARD, -0x1.00000001p+31, 0, FE_INVALID, -FE_UPWARD, -0x1.00000001p+31, -2147483648, FE_INEXACT, -FE_TOWARDZERO, -0x1.00000001p+31, -2147483648, FE_INEXACT, -FE_TONEAREST, 0x1p+32, 0, FE_INVALID, -FE_DOWNWARD, 0x1p+32, 0, FE_INVALID, -FE_UPWARD, 0x1p+32, 0, FE_INVALID, -FE_TOWARDZERO, 0x1p+32, 0, FE_INVALID, -FE_TONEAREST, -0x1p+32, 0, FE_INVALID, -FE_DOWNWARD, -0x1p+32, 0, FE_INVALID, -FE_UPWARD, -0x1p+32, 0, FE_INVALID, -FE_TOWARDZERO, -0x1p+32, 0, FE_INVALID, -FE_TONEAREST, 0x1.ffffffffp+31, 0, FE_INVALID, -FE_DOWNWARD, 0x1.ffffffffp+31, 0, FE_INVALID, -FE_UPWARD, 0x1.ffffffffp+31, 0, FE_INVALID, -FE_TOWARDZERO, 0x1.ffffffffp+31, 0, FE_INVALID, -FE_TONEAREST, -0x1.ffffffffp+31, 0, FE_INVALID, -FE_DOWNWARD, -0x1.ffffffffp+31, 0, FE_INVALID, -FE_UPWARD, -0x1.ffffffffp+31, 0, FE_INVALID, -FE_TOWARDZERO, -0x1.ffffffffp+31, 0, FE_INVALID, }; -void test_lrint() +int main(void) { - int f, i; - long n; + #pragma STDC FENV_ACCESS ON + long long yi; + int e, i, err = 0; + struct d_i *p; for (i = 0; i < sizeof t/sizeof *t; i++) { - fesetround(t[i].round); - feclearexcept(FE_ALL_EXCEPT); - n = lrint(t[i].x); - f = fetestexcept(FE_ALL_EXCEPT); - - if (t[i].except != FE_INVALID && n != t[i].n) - error("round=%s, lrint(%a) want %ld got %ld\n", strround(t[i].round), t[i].x, t[i].n, n); - if (f != t[i].except) - error("round=%s, lrint(%a)==%ld want except=%s, got except=%s\n", - strround(t[i].round), t[i].x, t[i].n, strdup(strexcept(t[i].except)), strdup(strexcept(f))); - } -} - -void bench_lrint_simple(int N) -{ - int i; - volatile int n; + p = t + i; - for (i = 0; i < N; i++) { - n = lrint(1.25); - } -} - -void bench_lrint_hard(int N) -{ - int i; - volatile int n; - - for (i = 0; i < N; i++) { -// feclearexcept(FE_ALL_EXCEPT); -// n = lrint(1.5); -// n = lrint(0x1p32); -// n = lrint(-0x1p31); - n = lrint(0x1p31+0.5); + if (p->r < 0) + continue; + fesetround(p->r); + feclearexcept(FE_ALL_EXCEPT); + yi = lrint(p->x); + e = fetestexcept(INEXACT|INVALID|DIVBYZERO|UNDERFLOW|OVERFLOW); + + if (!checkexcept(e, p->e, p->r)) { + printf("%s:%d: bad fp exception: %s lrint(%a)=%lld, want %s", + p->file, p->line, rstr(p->r), p->x, p->i, estr(p->e)); + printf(" got %s\n", estr(e)); + err++; + } + if (yi != p->i) { + printf("%s:%d: %s lrint(%a) want %lld got %lld\n", + p->file, p->line, rstr(p->r), p->x, p->i, yi); + err++; + } } + return !!err; }