1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
|
#include "common.cl"
DEFINE_BODY_V (
test_ilogb, ({
/* ilogb */
Ivec ires;
ires.v = ilogb (val.v);
Ivec igoodres;
equal = true;
for (int n = 0; n < vecsize; ++n)
{
if (ISNAN (val.s[n]))
{
igoodres.s[n] = FP_ILOGBNAN;
}
else if (val.s[n] == (stype)0)
{
igoodres.s[n] = FP_ILOGB0;
}
else if (isinf (val.s[n]))
{
igoodres.s[n] = INT_MAX;
}
else
{
// We round down to "correct" for inaccuracies in log2
// We divide by 2 since log2 is wrong for large inputs
igoodres.s[n]
= 1
+ rint (floor (0.999999f
* log2 (0.5 * fabs (val.s[n]))));
}
equal = equal && ires.s[n] == igoodres.s[n];
}
if (!equal)
{
for (int n = 0; n < vecsize; ++n)
{
printf ("FAIL: ilogb type=%s val=%.17g res=%d good=%d\n",
typename, val.s[n], (int)ires.s[n], (int)igoodres.s[n]);
}
return;
}
}))
kernel void
test_ilogb ()
{
CALL_FUNC_V (test_ilogb)
}
|