Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the minimum buffer size for sprintf with %g?

Tags:

c

double

printf

The problem is to statically allocate a buffer large enough to fit a printed double, formatted with %g at maximum precision. This seems like a simple enough task, bu I'm having trouble. The best I have come up with (assuming the number to be printed is x) is

char buf[1 + DBL_DIG + DBL_DIG + 1 + 1 + 1 + DBL_DIG + 1];
int len = sprintf(buf, "%.*g", DBL_DIG, x);

The DBL_DIG macro is from float.h, and apparently it is supposed to indicate the maximum precision for the type double. We need:

  • 1 byte for a negative sign
  • enough bytes to capture the significant digits
  • at most one 'separator' char (comma, etc.) per digit
  • 1 byte for a decimal point
  • 1 byte for 'e'
  • 1 byte for the sign on the exponent
  • some bytes for the exponent
  • 1 byte for the trailing null written by sprintf.

I'm using the number of significant digits as an upper bound on the number of digits in the exponent. Have I made any errors? Is there a better solution? Should I just allocate 64, 128, or 256 bytes and hope for the best?


1 Answers

You cannot pre-calculate the size at compile time. The %g formatter takes the locale into account (for the 1000's separator etc.) See http://linux.die.net/man/3/sprintf for a description on how to calculate the size safely.

like image 130
an0nym0usc0ward Avatar answered Dec 04 '25 03:12

an0nym0usc0ward



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!