printf icon indicating copy to clipboard operation
printf copied to clipboard

Format "%.4g" not working as expected

Open fbeaulier opened this issue 5 years ago • 3 comments

I tested printf("%.4g", (double)4); and it displays 4.000 instead of just 4 I have checked to be sure, the standard libc with gcc on Linux displays 4

fbeaulier avatar Mar 10 '20 15:03 fbeaulier

Hi ... I've just found this issue also .. just running through a few tests and actually %g has quite a few issues...

In the below STD is the normal printf (this is a Mac, but it's the same on Linux), and NEW is this printf.

Lee.

Using [%g] [%g ] double is (0.000000 ) STD (0 ) NEW (0.000000e-308 ) [%g ] double is (0.000000 ) STD (1e-08 ) NEW (1.000000e-08 ) [%g ] double is (0.000000 ) STD (1e-07 ) NEW (1.000000e-07 ) [%g ] double is (0.000100 ) STD (0.0001 ) NEW (0.000100000 ) [%g ] double is (1.456789 ) STD (1.45679 ) NEW (1.45679 ) [%g ] double is (100.000000 ) STD (100 ) NEW (100.0000 ) [%g ] double is (100.001000 ) STD (100.001 ) NEW (100.001 ) [%g ] double is (100.000004 ) STD (100 ) NEW (100.000 ) [%g ] double is (112.294757 ) STD (112.295 ) NEW (112.295 ) [%g ] double is (484848444.00000) STD (4.84848e+08 ) NEW (4.848484e+08 ) [%g ] double is (-100.000000 ) STD (-100 ) NEW (-100.0000 ) [%g ] double is (-0.000100 ) STD (-0.0001 ) NEW (-0.000100000 ) [%g ] double is (-50.000000 ) STD (-50 ) NEW (-50.0000 ) [%g ] double is (-5000.000000 ) STD (-5000 ) NEW (-5000.00 ) [%g ] double is (-0.000000 ) STD (-1e-08 ) NEW (-1.000000e-08 ) [%g ] double is (-448488484.0000) STD (-4.48488e+08 ) NEW (-4.484885e+08 ) Using [%.4g] [%.4g ] double is (0.000000 ) STD (0 ) NEW (0.000e-308 ) [%.4g ] double is (0.000000 ) STD (1e-08 ) NEW (1.000e-08 ) [%.4g ] double is (0.000000 ) STD (1e-07 ) NEW (1.000e-07 ) [%.4g ] double is (0.000100 ) STD (0.0001 ) NEW (0.0001000 ) [%.4g ] double is (1.456789 ) STD (1.457 ) NEW (1.457 ) [%.4g ] double is (100.000000 ) STD (100 ) NEW (100.00 ) [%.4g ] double is (100.001000 ) STD (100 ) NEW (100.0 ) [%.4g ] double is (100.000004 ) STD (100 ) NEW (100.0 ) [%.4g ] double is (112.294757 ) STD (112.3 ) NEW (112.3 ) [%.4g ] double is (484848444.00000) STD (4.848e+08 ) NEW (4.848e+08 ) [%.4g ] double is (-100.000000 ) STD (-100 ) NEW (-100.00 ) [%.4g ] double is (-0.000100 ) STD (-0.0001 ) NEW (-0.0001000 ) [%.4g ] double is (-50.000000 ) STD (-50 ) NEW (-50.00 ) [%.4g ] double is (-5000.000000 ) STD (-5000 ) NEW (-5000 ) [%.4g ] double is (-0.000000 ) STD (-1e-08 ) NEW (-1.000e-08 ) [%.4g ] double is (-448488484.0000) STD (-4.485e+08 ) NEW (-4.485e+08 ) Using [%4g] [%4g ] double is (0.000000 ) STD ( 0 ) NEW (0.000000e-308 ) [%4g ] double is (0.000000 ) STD (1e-08 ) NEW (1.000000e-08 ) [%4g ] double is (0.000000 ) STD (1e-07 ) NEW (1.000000e-07 ) [%4g ] double is (0.000100 ) STD (0.0001 ) NEW (0.000100000 ) [%4g ] double is (1.456789 ) STD (1.45679 ) NEW (1.45679 ) [%4g ] double is (100.000000 ) STD ( 100 ) NEW (100.0000 ) [%4g ] double is (100.001000 ) STD (100.001 ) NEW (100.001 ) [%4g ] double is (100.000004 ) STD ( 100 ) NEW (100.000 ) [%4g ] double is (112.294757 ) STD (112.295 ) NEW (112.295 ) [%4g ] double is (484848444.00000) STD (4.84848e+08 ) NEW (4.848484e+08 ) [%4g ] double is (-100.000000 ) STD (-100 ) NEW (-100.0000 ) [%4g ] double is (-0.000100 ) STD (-0.0001 ) NEW (-0.000100000 ) [%4g ] double is (-50.000000 ) STD ( -50 ) NEW (-50.0000 ) [%4g ] double is (-5000.000000 ) STD (-5000 ) NEW (-5000.00 ) [%4g ] double is (-0.000000 ) STD (-1e-08 ) NEW (-1.000000e-08 ) [%4g ] double is (-448488484.0000) STD (-4.48488e+08 ) NEW (-4.484885e+08 ) Using [%4.4g] [%4.4g ] double is (0.000000 ) STD ( 0 ) NEW (0.000e-308 ) [%4.4g ] double is (0.000000 ) STD (1e-08 ) NEW (1.000e-08 ) [%4.4g ] double is (0.000000 ) STD (1e-07 ) NEW (1.000e-07 ) [%4.4g ] double is (0.000100 ) STD (0.0001 ) NEW (0.0001000 ) [%4.4g ] double is (1.456789 ) STD (1.457 ) NEW (1.457 ) [%4.4g ] double is (100.000000 ) STD ( 100 ) NEW (100.00 ) [%4.4g ] double is (100.001000 ) STD ( 100 ) NEW (100.0 ) [%4.4g ] double is (100.000004 ) STD ( 100 ) NEW (100.0 ) [%4.4g ] double is (112.294757 ) STD (112.3 ) NEW (112.3 ) [%4.4g ] double is (484848444.00000) STD (4.848e+08 ) NEW (4.848e+08 ) [%4.4g ] double is (-100.000000 ) STD (-100 ) NEW (-100.00 ) [%4.4g ] double is (-0.000100 ) STD (-0.0001 ) NEW (-0.0001000 ) [%4.4g ] double is (-50.000000 ) STD ( -50 ) NEW (-50.00 ) [%4.4g ] double is (-5000.000000 ) STD (-5000 ) NEW (-5000 ) [%4.4g ] double is (-0.000000 ) STD (-1e-08 ) NEW (-1.000e-08 ) [%4.4g ] double is (-448488484.0000) STD (-4.485e+08 ) NEW (-4.485e+08 ) Using [%.14g] [%.14g ] double is (0.000000 ) STD (0 ) NEW (0.0000000000000) [%.14g ] double is (0.000000 ) STD (1e-08 ) NEW (0.9999999890000) [%.14g ] double is (0.000000 ) STD (1e-07 ) NEW (0.9999999990000) [%.14g ] double is (0.000100 ) STD (0.0001 ) NEW (0.0001000000000) [%.14g ] double is (1.456789 ) STD (1.456789 ) NEW (1.4567890000000) [%.14g ] double is (100.000000 ) STD (100 ) NEW (100.00000000000) [%.14g ] double is (100.001000 ) STD (100.001 ) NEW (100.00100000000) [%.14g ] double is (100.000004 ) STD (100.000004 ) NEW (100.00000400000) [%.14g ] double is (112.294757 ) STD (112.294757 ) NEW (112.29475700000) [%.14g ] double is (484848444.00000) STD (484848444 ) NEW (4.8484844400000) [%.14g ] double is (-100.000000 ) STD (-100 ) NEW (-100.0000000000) [%.14g ] double is (-0.000100 ) STD (-0.0001 ) NEW (-0.000100000000) [%.14g ] double is (-50.000000 ) STD (-50 ) NEW (-50.00000000000) [%.14g ] double is (-5000.000000 ) STD (-5000 ) NEW (-5000.000000000) [%.14g ] double is (-0.000000 ) STD (-1e-08 ) NEW (-0.999999989000) [%.14g ] double is (-448488484.0000) STD (-448488484 ) NEW (-4.484884840000)

essele avatar Feb 23 '21 12:02 essele

@essele : Does your repository address all of these?

eyalroz avatar Jul 14 '21 21:07 eyalroz

@fbeaulier : In fact, it's even worse than that. The current test suite has tests of the %g specifier with incorrect expected results - specifically in these cases:

  test::sprintf(buffer, "%.6G", 12345.);
  REQUIRE(!strcmp(buffer, "12345.0"));

actually, it should be 12345, no decimal point and no trailing zero. And:

  test::sprintf(buffer, "%0-15.3g", -42.);
  REQUIRE(!strcmp(buffer, "-42.0          "));

actually, it should be 42, no decimal point and no trailing zero.

However - I'm about to resolve this on my fork.

eyalroz avatar Jul 30 '21 18:07 eyalroz