* device/lib/pic/libsdcc/fsdiv.c,
[fw/sdcc] / device / lib / pic16 / libsdcc / float / fsdiv.c
index e438a577dc11d4164ee4eaf297e945d5c2c8c8e2..767f8032c037ce4f055fd7185791724f66d6335a 100644 (file)
@@ -35,7 +35,7 @@ float __fsdiv (float a1, float a2) _FS_REENTRANT
   volatile long result;
   volatile unsigned long mask;
   volatile long mant1, mant2;
-  volatile int exp ;
+  volatile int exp;
   char sign;
 
   fl1.f = a1;
@@ -51,8 +51,10 @@ float __fsdiv (float a1, float a2) _FS_REENTRANT
 
   /* divide by zero??? */
   if (!fl2.l)
-    /* return NaN or -NaN */
-    return (-1.0);
+    {/* return NaN or -NaN */
+      fl2.l = 0x7FC00000;
+      return (fl2.f);
+    }
 
   /* numerator zero??? */
   if (!fl1.l)
@@ -93,7 +95,12 @@ float __fsdiv (float a1, float a2) _FS_REENTRANT
   result &= ~HIDDEN;
 
   /* pack up and go home */
-  fl1.l = PACK (sign ? 1ul<<31 : 0, (unsigned long) exp, result);
+  if (exp >= 0x100)
+    fl1.l = (sign ? SIGNBIT : 0) | 0x7F800000;
+  else if (exp < 0)
+    fl1.l = 0;
+  else
+    fl1.l = PACK (sign ? SIGNBIT : 0 , exp, result);
   return (fl1.f);
 }