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
Post a Comment