/* File: round.c. Round numbers to specified precision.  */
#include <stdio.h>
#include "genlib.h"
#include "simpio.h"
#include "math.h"
double round(double x, int precision) ;
double power(double base, double exponent) ;

main() {
   double x ;
   int places ;

   while (TRUE) {
      printf("x? ") ;
      x = GetReal() ;
      printf("places? ") ;
      places = GetInteger() ;
      if (places < 0) break ;
       
      printf("%f rounded to %d places: %g\n",
	 x, places, round(x,places) ) ;
   }
}

double round(double x, int precision) {
   int sign ;
   double power10, temp_x, result ;

   if (x < 0) {
      sign = -1 ;
   } else {
      sign = 1 ;
   }
   if (precision >= 0) {
      power10 = power(10.0, precision) ;
      temp_x = fabs(x) * power10 ;
      result = sign * floor(temp_x + 0.5) / power10 ; 
      return(result) ;
   } else {
      printf("Error: negative precision\n") ;
      return(x) ;
   }
}

double power(double base, double exponent) {
   return( exp ( exponent * log(base) ) ) ;
}
