Visual Studio 6Visual C++ 7.0Windows 2000Visual C++ 6.0Windows XPIntermediateDevVisual StudioWindowsC++
A Strategy for Displaying Numeric Data with Significant Figures






2.33/5 (6 votes)
Dec 6, 2002

62010
A strategy for displaying numeric data with significant figures using Log10.
Introduction
Problem: Some times numeric data, for example floats and doubles, needs to be displayed with a certain amount of decimal precision and at times with a given amount of significant figures.
For example:
4.5568 displayed with 2 Significant Figures is: 4.6
0.0221 displayed with 3 Significant Figures is: 0.022
5.9 displayed with 1 Significant Figures is: 6
Strategy: Using the log10
function we can calculate the number of digits for the integer part of the number we are manipulating. The decimal part of the number can be displayed properly with a sprintf
call or something similar as we can see in our function below. This solution also rounds the final number, which is usually desirable when displaying significant figures.
double CalculateSigFig(double num, int sigfig) { char buff[128];//temp buffer double temp = 0; int lognum = 0; std::string formatbuff;//format string if(sigfig <= 0 || num == 0)//damage control return num; temp = int(num); if(temp * -1 > 0)//check for negative numbers temp *= -1; lognum = (int)log10(temp);//get significant digits of integer part of num ++lognum; //adjust for log10 results sigfig -= lognum;//subtract for decimal precision calculation if(sigfig < 0)//check for negative results sigfig = 0; //construct format string formatbuff = "%"; itoa(lognum, buff, 10);//convert lognum to int formatbuff += buff; formatbuff += "."; itoa(sigfig, buff, 10); formatbuff += buff; formatbuff += "f"; //end construct format string //use format string to get desired results sprintf(buff, formatbuff.c_str(), num); return atof(buff);//return double converted from string }