Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

double to string conversion with fixed width

Tags:

c++

formatting

I would like to print a double value, into a string of no more than 8 characters. The printed number should have as many digits as possible, e.g.

5.259675
48920568
8.514e-6
-9.4e-12

I tried C++ iostreams, and printf-style, and neither respects the provided size in the way I would like it to:

cout << setw(8) <<  1.0 / 17777.0 << endl;
printf( "%8g\n", 1.0 / 17777.0 );

gives:

5.62525e-005
5.62525e-005

I know I can specify a precision, but I would have to provide a very small precision here, in order to cover the worst case. Any ideas how to enforce an exact field width without sacrificing too much precision? I need this for printing matrices. Do I really have to come up with my own conversion function?

A similar question has been asked 5 years ago: Convert double to String with fixed width , without a satisfying answer. I sure hope there has been some progress in the meantime.

like image 1000
pentadecagon Avatar asked May 31 '14 14:05

pentadecagon


1 Answers

This seems not too difficult, actually, although you can't do it in a single function call. The number of character places used by the exponent is really quite easy to predict:

const char* format;
if (value > 0) {
    if (value < 10e-100) format = "%.1e";
    else if (value < 10e-10) format = "%.2e";
    else if (value < 1e-5) format = "%.3e";
}

and so on.

Only, the C standard, where the behavior of printf is defined, insists on at least two digits for the exponent, so it wastes some there. See c++ how to get "one digit exponent" with printf

Incorporating those fixes is going to make the code fairly complex, although still not as bad as doing the conversion yourself.

like image 161
Ben Voigt Avatar answered Nov 16 '22 12:11

Ben Voigt