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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
|
#define WITHIN32(v, f) (((v) >= f##_MIN32) && ((v) <= f##_MAX32))
#define WITHIN64(v, f) (((v) >= f##_MIN64) && ((v) <= f##_MAX64))
Bool NA_IeeeSpecial32( Float32 *f, Int32 *mask)
{
Int32 category;
UInt32 *f1 = (UInt32 *) f;
UInt32 v = *f1;
if (v & BIT(31)) {
if (WITHIN32(v, NEG_NORMALIZED)) {
category = MSK_NEG_NOR;
} else if (WITHIN32(v, NEG_DENORMALIZED)) {
category = MSK_NEG_DEN;
} else if (WITHIN32(v, NEG_SIGNAL_NAN)) {
category = MSK_NEG_SNAN;
} else if (WITHIN32(v, NEG_QUIET_NAN)) {
category = MSK_NEG_QNAN;
} else if (v == NEG_INFINITY_MIN32) {
category = MSK_NEG_INF;
} else if (v == NEG_ZERO_MIN32) {
category = MSK_NEG_ZERO;
} else if (v == INDETERMINATE_MIN32) {
category = MSK_INDETERM;
} else {
category = MSK_BUG;
}
} else {
if (WITHIN32(v, POS_NORMALIZED)) {
category = MSK_POS_NOR;
} else if (WITHIN32(v, POS_DENORMALIZED)) {
category = MSK_POS_DEN;
} else if (WITHIN32(v, POS_SIGNAL_NAN)) {
category = MSK_POS_SNAN;
} else if (WITHIN32(v, POS_QUIET_NAN)) {
category = MSK_POS_QNAN;
} else if (v == POS_INFINITY_MIN32) {
category = MSK_POS_INF;
} else if (v == POS_ZERO_MIN32) {
category = MSK_POS_ZERO;
} else {
category = MSK_BUG;
}
}
return (category & *mask) != 0;
}
Bool NA_IeeeSpecial64( Float64 *f, Int32 *mask)
{
Int32 category;
UInt64 *f1 = (UInt64 *) f;
UInt64 v = *f1;
if (v & BIT(63)) {
if (WITHIN64(v, NEG_NORMALIZED)) {
category = MSK_NEG_NOR;
} else if (WITHIN64(v, NEG_DENORMALIZED)) {
category = MSK_NEG_DEN;
} else if (WITHIN64(v, NEG_SIGNAL_NAN)) {
category = MSK_NEG_SNAN;
} else if (WITHIN64(v, NEG_QUIET_NAN)) {
category = MSK_NEG_QNAN;
} else if (v == NEG_INFINITY_MIN64) {
category = MSK_NEG_INF;
} else if (v == NEG_ZERO_MIN64) {
category = MSK_NEG_ZERO;
} else if (v == INDETERMINATE_MIN64) {
category = MSK_INDETERM;
} else {
category = MSK_BUG;
}
} else {
if (WITHIN64(v, POS_NORMALIZED)) {
category = MSK_POS_NOR;
} else if (WITHIN64(v, POS_DENORMALIZED)) {
category = MSK_POS_DEN;
} else if (WITHIN64(v, POS_SIGNAL_NAN)) {
category = MSK_POS_SNAN;
} else if (WITHIN64(v, POS_QUIET_NAN)) {
category = MSK_POS_QNAN;
} else if (v == POS_INFINITY_MIN64) {
category = MSK_POS_INF;
} else if (v == POS_ZERO_MIN64) {
category = MSK_POS_ZERO;
} else {
category = MSK_BUG;
}
}
return (category & *mask) != 0;
}
|