c - Controlling precision of doubles -


hey guys finished basic c program displays ordered set, least value, max value, average , median user inputs given set of numbers. problem i'm having have set standard amount of precision using "3.2%f" when print numbers, how can print them minimum amount of decimal places want each number? example, if input 5, 5.5, -0.2313, , 4 program display them in order -0.23, 4.00, 5.00, , 5.50. how can read -.2313, 4, 5, , 5.5? in advance help.

#include <stdio.h>  int findsize(); void sortarray(int size, double num[]); double findaverage(int size, double num[]); double findmedian(int size, double num[]); void findlowtohigh(int size, double num[]); void findhightolow(int size, double num[]);  int main() {  while(1)  {   int size = findsize();    if(size <= 1)   {    return 0;   }    double num[size];   double lowest = 0;   double highest = 0;   double average = 0;   double median = 0;    fprintf(stdout, "\n");     sortarray(size, num);     findlowtohigh(size, num);      findhightolow(size, num);    average = findaverage(size, num);     median = findmedian(size, num);    fprintf(stdout, "\n\nlowest value: %3.4f", num[0]);   fprintf(stdout, "\nhighest value: %3.4f", num[size-1]);   fprintf(stdout, "\n\naverage value: %3.4f\n", average);     fprintf(stdout, "median value: %3.4f", median);    fprintf(stdout, "\n");  }  }  int findsize() {  int size;   fprintf(stdout, "\nplease enter size of array: ");  scanf("%d", &size);   return size; }  void sortarray(int size, double num[]) {  for(int = 0; <= size - 1; i++)  {   int j = i+1;   fprintf(stdout, "please enter number %d: ", j);   fscanf(stdin, "%lf", &num[i]);  }   if(size > 1)  {   double holder = 0;    for(int y = 0; y < size - 1; y++)   {     for(int k = 0; k < size - 1; k++)    {     if(num[k] > num[k+1])     {       holder = num[k];      num[k] = num[k+1];      num[k+1] = holder;     }    }   }  } }  void findlowtohigh(int size, double num[]) {  fprintf(stdout, "\nfrom least greatest: ");   for(int x = 0; x <= size - 1; x++)  {   fprintf(stdout, "%3.2f ", num[x]);  } }  void findhightolow(int size, double num[]) {  fprintf(stdout, "\nfrom greatest least: ");   int reverse = size - 1;   while(reverse != -1)  {   fprintf(stdout, "%3.2f ", num[reverse]);   reverse--;  } }  double findaverage(int size, double num[]) {  double average = 0;   for(int = 0; <= size - 1; a++)  {   average = average + num[a];  }   average = average / size;   return average; }   double findmedian(int size, double num[]) {  double median = 0;   if(size % 2 == 0)  {   median = (num[size/2 - 1] + num[size/2])/2;  }  else  {   median = num[size/2];  }   return median; } 

let sprintf() heavy lifting , lop off trailing zeros.

char *print_min_precision(char * buffer) {   // fo rthe decimal point, if not found return without altering buffer   if (strchr(buffer, '.') == null)     return buffer;   // find last digit   char *p = &buffer[strlen(buffer) - 1];   // while not @ beginning , digit 0 ...   while (p > buffer && *p == '0') {     // change '0' `\0`     *p-- = '\0';   }   if (p > buffer && *p == '.') {     *p-- = '\0';   }   return buffer; }   char buf[400]; // ba buffer // print number using %f format. // 6 here maximum number of fractional digits use sprintf(buf, "%.6f", num[reverse]);   // print reduced number. fprintf(stdout, "%s ", print_min_precision(buf));   

in general, attempting numerically figure out trailing decimals has many edge conditions. better print buffer , post-process it. sure provide adequate buffers things like:

print_min_precision(sprintf(buf, "%.6f", 10e300)); 

Comments

Popular posts from this blog

user interface - How to replace the Python logo in a Tkinter-based Python GUI app? -

objective c - Greedy NSProgressIndicator Allocation -

how to set an OCR language in Google Drive -