On Thu, Mar 03, 2011 at 11:06:33AM -0500, Pavel Ivanov scratched on the wall:
> > ?A favorite interview question is, given this line and no other
> > ?information, how big must buf_size be to never clip the output?
> > ?You can assume the default 1.6 precision ("%1.6f").
> > ? ?snprintf( buf, buf_size, "%f", v );
> > ?The answer? ?At least 318 characters.
> 
> This is very interesting. Jay, could you explain the answer? Doesn't
> %1.6f limit number of digits to print?

  Although the default precision is 1.6, that means "please use *at
  least* one digit to the left of the decimal point, and no more than six
  to the right."  The right side is limited, the left is not.

  As per the discussion about var-arg values, you must assume "v" is a
  64-bit double.  Most people assume it is a 32-bit float.

  The largest number that can be represented by a 64-bit IEEE 754
  number is 309 digits long.  Add one character for the decimal
  point, six more for trailing zeros, and one for the terminator
  character.  Making the number negative adds one more character
  in front.

  The binary value is 0xFFEFFFFFFFFFFFFF.  The value written into the
  buffer is:

  -1797693134862315708145274237317043567980705675258
  44996598917476803157260780028538760589558632766878
  17154045895351438246423432132688946418276846754670
  35375169860499105765512820762454900903893289440758
  68508455133942304583236903222948165808559332123348
  27479782620414472316873817718091929988125040402618
  4124858368.000000[\0]


  This kind of thing is exactly why so much software is full of
  buffer overruns.

   -j

------------------------------------------------------------
#include <stdio.h>
#include <string.h>

int main( int argc, char** argv)
{
        long long int   i = 0xFFEFFFFFFFFFFFFFLL;
        double          *p = (double*)&i;
        char            b[512];

        snprintf( b, sizeof(b), "%f", *p );
        printf( "%d\n%s\n", strlen( b )+1, b );  /* add one for \0 */
}
------------------------------------------------------------



   -j

-- 
Jay A. Kreibich < J A Y  @  K R E I B I.C H >

"Intelligence is like underwear: it is important that you have it,
 but showing it to the wrong people has the tendency to make them
 feel uncomfortable." -- Angela Johnson
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to