Skip to contentSkip to conversation

remove all floating point operations

RFC PATCH New Pavel Roskin 1 participant 1 message Jun 13, 2008

lore
Share & tools
lore
#0 lore raw

RFC PATCH 1/1 remove all floating point operations

Hello!

This patch should remove all dependency of floating point support in GRUB. The patch makes sure that all rounding is done to the nearest integer.

include/grub/powerpc/libgcc.h will be cleaned up separately.

Signature · 2 lines
Regards,
Pavel Roskin
commands/ls.c +7 -3
index 77af426..4257e02 100644
@@ -108,21 +108,25 @@ grub_ls_list_files (char *dirname, int longlist, int all, int human)
 	    grub_printf ("%-12llu", (unsigned long long) file->size);
 	  else
 	    {
-	      float fsize = file->size;
+	      grub_uint64_t fsize = file->size * 100ULL;
 	      int fsz = file->size;
 	      int units = 0;
 	      char buf[20];
 	      
 	      while (fsz / 1024)
 		{
-		  fsize /= 1024;
+		  fsize = (fsize + 512) / 1024;
 		  fsz /= 1024;
 		  units++;
 		}
 
 	      if (units)
 		{
-		  grub_sprintf (buf, "%0.2f%c", fsize, grub_human_sizes[units]);
+		  grub_uint32_t whole, fraction;
+
+		  whole = grub_divmod64 (fsize, 100, &fraction);
+		  grub_sprintf (buf, "%u.%02u%c", whole, fraction,
+				grub_human_sizes[units]);
 		  grub_printf ("%-12s", buf);
 		}
 	      else
kern/misc.c +0 -31
index 444ce2e..c662c96 100644
@@ -655,24 +655,6 @@ grub_lltoa (char *str, int c, unsigned long long n)
   return p;
 }
 
-static char *
-grub_ftoa (char *str, double f, int round)
-{
-  unsigned int intp;
-  unsigned int fractp;
-  unsigned int power = 1;
-  int i;
-
-  for (i = 0; i < round; i++)
-    power *= 10;
-
-  intp = f;
-  fractp = (f - (float) intp) * power;
-
-  grub_sprintf (str, "%d.%d", intp, fractp);
-  return str;
-}
-
 int
 grub_vsprintf (char *str, const char *fmt, va_list args)
 {
@@ -807,19 +789,6 @@ grub_vsprintf (char *str, const char *fmt, va_list args)
 	      write_char (n & 0xff);
 	      break;
 
-	    case 'f':
-	      {
-		float f;
-		f = va_arg (args, double);
-		grub_ftoa (tmp, f, format2);
-		if (!rightfill && grub_strlen (tmp) < format1)
-		  write_fill (zerofill, format1 - grub_strlen (tmp));
-		write_str (tmp);
-		if (rightfill && grub_strlen (tmp) < format1)
-		  write_fill (zerofill, format1 - grub_strlen (tmp));
-		break;
-	      }
-	      
 	    case 'C':
 	      {
 		grub_uint32_t code = va_arg (args, grub_uint32_t);