The bitwise construction of the floating-point numbers is a red herring. This much simpler test yields the same result: printf("%#.0g\n", 0.000956); printf("%#.0g\n", 0.000098); According to my understanding of the man page and the C99 spec, the output should be: 0.001 0.0001 The Solaris printf() agrees with that, but the glibc 2.3.1 printf() outputs: 0.0010 1.e-04 AMC