diff --git a/riscv_private.h b/riscv_private.h
index de84b8a3..e789f014 100644
--- a/riscv_private.h
+++ b/riscv_private.h
@@ -109,6 +109,7 @@ enum {
     FMASK_SIGN        = 0b10000000000000000000000000000000,
     FMASK_EXPN        = 0b01111111100000000000000000000000,
     FMASK_FRAC        = 0b00000000011111111111111111111111,
+    FMASK_QNAN        = 0b00000000010000000000000000000000,
     //                    ....xxxx....xxxx....xxxx....xxxx
     FFLAG_MASK        = 0b00000000000000000000000000011111,
     FFLAG_INVALID_OP  = 0b00000000000000000000000000010000,
@@ -312,7 +313,7 @@ static inline uint32_t calc_fclass(uint32_t f) {
   /* 0x001    rs1 is -INF */
   out |= (f == 0xff800000) ? 0x001 : 0;
   /* 0x002    rs1 is negative normal */
-  out |= (expn && expn < 0x78000000 && sign) ? 0x002 : 0;
+  out |= (expn && (expn != FMASK_EXPN) && sign) ? 0x002 : 0;
   /* 0x004    rs1 is negative subnormal */
   out |= (!expn && frac && sign) ? 0x004 : 0;
   /* 0x008    rs1 is -0 */
@@ -322,13 +323,13 @@ static inline uint32_t calc_fclass(uint32_t f) {
   /* 0x020    rs1 is positive subnormal */
   out |= (!expn && frac && !sign) ? 0x020 : 0;
   /* 0x040    rs1 is positive normal */
-  out |= (expn && expn < 0x78000000 && !sign) ? 0x040 : 0;
+  out |= (expn && (expn != FMASK_EXPN) && !sign) ? 0x040 : 0;
   /* 0x080    rs1 is +INF */
-  out |= (f == 0x7f800000) ? 0x080 : 0;
+  out |= (expn == FMASK_EXPN && !frac && !sign) ? 0x080 : 0;
   /* 0x100    rs1 is a signaling NaN */
-  out |= (expn == FMASK_EXPN && (frac <= 0x7ff) && frac) ? 0x100 : 0;
+  out |= (expn == FMASK_EXPN && frac && !(frac & FMASK_QNAN)) ? 0x100 : 0;
   /* 0x200    rs1 is a quiet NaN */
-  out |= (expn == FMASK_EXPN && (frac >= 0x800)) ? 0x200 : 0;
+  out |= (expn == FMASK_EXPN && (frac & FMASK_QNAN))? 0x200 : 0;
 
   return out;
 }