Index: doc/user/user.tex
===================================================================
--- doc/user/user.tex	(revision bb1eabcd6f64b0ee41ffacd7dd40e7329004f68e)
+++ doc/user/user.tex	(revision 244335bac9fe48993091c4a55d03642bd67e9a62)
@@ -11,6 +11,6 @@
 %% Created On       : Wed Apr  6 14:53:29 2016
 %% Last Modified By : Peter A. Buhr
-%% Last Modified On : Mon May  4 07:19:24 2026
-%% Update Count     : 7436
+%% Last Modified On : Mon May  4 12:09:44 2026
+%% Update Count     : 7440
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
@@ -5405,5 +5405,5 @@
 
 \item
-\Indexc{hex}( integer / floating-point  / character / string )\index{manipulator!hex@©hex©} print value in base 16 preceded by ©0x©/©0X©.
+\Indexc{hex}( integer / floating-point / character / string )\index{manipulator!hex@©hex©} print value in base 16 preceded by ©0x©/©0X©.
 \begin{cfa}[belowskip=0pt]
 sout | hex( 0 ) | hex( 27HH ) | hex( 27H ) | hex( 27 ) | hex( 27L );
@@ -5412,5 +5412,5 @@
 0xe5 0xffe5 0xffffffe5 0xffffffffffffffe5
 sout | hex( 0.0 ) | hex( 27.5F ) | hex( 27.5 ) | hex( 27.5L );
-0x0p+0 0x1.b8p+4 0x1.b8p+4 0xd.cp+1
+0x0.p+0 0x1.b8p+4 0x1.b8p+4 0xd.cp+1
 sout | hex( -27.5F ) | hex( -27.5 ) | hex( -27.5L );
 -0x1.b8p+4 -0x1.b8p+4 -0xd.cp+1
Index: libcfa/src/iostream.cfa
===================================================================
--- libcfa/src/iostream.cfa	(revision bb1eabcd6f64b0ee41ffacd7dd40e7329004f68e)
+++ libcfa/src/iostream.cfa	(revision 244335bac9fe48993091c4a55d03642bd67e9a62)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun May  3 22:02:37 2026
-// Update Count     : 2271
+// Last Modified On : Mon May  4 12:00:48 2026
+// Update Count     : 2310
 //
 
@@ -599,4 +599,14 @@
 #define SUFFIXES_END (SUFFIXES_START + (int)((sizeof(suffixes) / sizeof(char *) - 1) * 3))
 
+// Float-point numbers without a fraction are always printed with a decimal point to reflect the constant type.
+// Programmers must explicitly disable printing the decimal point for values with no fraction using manipulator nodp.
+// printf supports printing the decimal point using flag #. However specifier g is broken with #.
+//
+//   printf( "%g %#g %g %#g\n", 4., 4., 4.5, 4.5 );
+//   4 4.00000 4.5 4.50000
+//
+// when # is specified, g incorrectly prints 6 significant digits. As a result, # cannot be used to force printing of
+// the decimal point. Instead, any missing decimal point is manually added.
+
 #define PRINT_WITH_DP2( os, format, ... ) \
 	{ \
@@ -605,5 +615,5 @@
 			if ( isfinite( f.val ) && ! f.flags.nobsdp ) { /* if number, print decimal point when no fraction or exponent */ \
 				for ( i = 0; i < len && buf[i] != '.' && buf[i] != 'e' && buf[i] != 'E' && \
-							 buf[i] != 'p' && buf[i] != 'P'; i += 1 ); /* decimal point or scientific ? */ \
+						buf[i] != 'p' && buf[i] != 'P'; i += 1 ); /* decimal point or scientific ? */ \
 				if ( i == len ) { \
 					if ( ! f.flags.left ) { \
@@ -619,5 +629,5 @@
 		} else { \
 			int exp10, len2; \
-			eng( f.val, f.pc, exp10 );					/* changes arguments */ \
+			eng( f.val, f.pc, exp10 ); /* changes arguments */ \
 			/* printf( "%g %d %d %d %s\n", f.val, f.wd, f.pc, exp10, format ); */ \
 			if ( ! f.flags.left && f.wd > 1 ) { \
@@ -657,8 +667,8 @@
 \
 		if ( sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) ); \
-		char fmtstr[sizeof(DFMTP) + 8];					/* sizeof includes '\0' */ \
+		char fmtstr[sizeof(DFMTP) + 8]; /* sizeof includes '\0' */ \
 		if ( ! f.flags.pc ) memcpy( &fmtstr, DFMTNP, sizeof(DFMTNP) ); \
 		else memcpy( &fmtstr, DFMTP, sizeof(DFMTP) ); \
-		int star = 5;									/* position before first '*' */ \
+		int star = 5; /* position before first '*' */ \
 \
 		/* Insert flags into spaces before '*', from right to left. */ \
@@ -666,14 +676,15 @@
 		if ( f.flags.sign ) { fmtstr[star] = '+'; star -= 1; } \
 		if ( f.flags.pad0 ) { fmtstr[star] = '0'; star -= 1; } \
-		fmtstr[star] = '\''; star -= 1;					/* locale */ \
+		if ( f.base == 'f' && f.base == 'F' && f.base == 'g' && f.base == 'G' ) { fmtstr[star] = '\''; star -= 1; }	/* locale only for f andg */ \
+		else if ( ! f.flags.nobsdp && (f.base == 'a' || f.base == 'A') ) { fmtstr[star] = '#'; star -= 1; } /* hex special case  to get decimal point */ \
 		fmtstr[star] = '%'; \
 \
-		if ( ! f.flags.pc ) {							/* no precision */ \
-			fmtstr[sizeof(DFMTNP)-2] = f.base;			/* sizeof includes '\0' */ \
-			/* printf( "%g %d %s\n", f.val, f.wd, &fmtstr[star] ); */ \
+		if ( ! f.flags.pc ) { /* no precision */ \
+			fmtstr[sizeof(DFMTNP)-2] = f.base; /* sizeof includes '\0' */ \
+			/* printf( "[%g %c %d %s]\n", f.val, f.base, f.wd, &fmtstr[star] ); */ \
 			PRINT_WITH_DP2( os, &fmtstr[star], f.wd, f.val ) \
-		} else {										/* precision */ \
-			fmtstr[sizeof(DFMTP)-2] = f.base;			/* sizeof includes '\0' */ \
-			/* printf( "%g %d %d %s\n", f.val, f.wd, f.pc, &fmtstr[star] ); */ \
+		} else { /* precision */ \
+			fmtstr[sizeof(DFMTP)-2] = f.base; /* sizeof includes '\0' */ \
+			/* printf( "[%g %c %d %d %s]\n", f.val, f.base, f.wd, f.pc, &fmtstr[star] ); */ \
 			PRINT_WITH_DP2( os, &fmtstr[star], f.wd, f.pc, f.val ) \
 		} /* if */ \
Index: tests/io/.expect/manipulatorsOutput2.arm64.txt
===================================================================
--- tests/io/.expect/manipulatorsOutput2.arm64.txt	(revision bb1eabcd6f64b0ee41ffacd7dd40e7329004f68e)
+++ tests/io/.expect/manipulatorsOutput2.arm64.txt	(revision 244335bac9fe48993091c4a55d03642bd67e9a62)
@@ -6,5 +6,5 @@
 0x0 0x1b 0x1b 0x1b 0x1b
 0xe5 0xffe5 0xffffffe5 0xffffffffffffffe5
-0x0p+0 0x1.b8p+4 0x1.b8p+4 0x1.b8p+4
+0x0.p+0 0x1.b8p+4 0x1.b8p+4 0x1.b8p+4
 -0x1.b8p+4 -0x1.b8p+4 -0x1.b8p+4
 0.000000e+00 2.750000e+01 -2.750000e+01
Index: tests/io/.expect/manipulatorsOutput2.x64.txt
===================================================================
--- tests/io/.expect/manipulatorsOutput2.x64.txt	(revision bb1eabcd6f64b0ee41ffacd7dd40e7329004f68e)
+++ tests/io/.expect/manipulatorsOutput2.x64.txt	(revision 244335bac9fe48993091c4a55d03642bd67e9a62)
@@ -6,5 +6,5 @@
 0x0 0x1b 0x1b 0x1b 0x1b
 0xe5 0xffe5 0xffffffe5 0xffffffffffffffe5
-0x0p+0 0x1.b8p+4 0x1.b8p+4 0xd.cp+1
+0x0.p+0 0x1.b8p+4 0x1.b8p+4 0xd.cp+1
 -0x1.b8p+4 -0x1.b8p+4 -0xd.cp+1
 0.000000e+00 2.750000e+01 -2.750000e+01
Index: tests/io/.expect/manipulatorsOutput2.x86.txt
===================================================================
--- tests/io/.expect/manipulatorsOutput2.x86.txt	(revision bb1eabcd6f64b0ee41ffacd7dd40e7329004f68e)
+++ tests/io/.expect/manipulatorsOutput2.x86.txt	(revision 244335bac9fe48993091c4a55d03642bd67e9a62)
@@ -6,5 +6,5 @@
 0x0 0x1b 0x1b 0x1b 0x1b
 0xe5 0xffe5 0xffffffe5 0xffffffe5
-0x0p+0 0x1.b8p+4 0x1.b8p+4 0xd.cp+1
+0x0.p+0 0x1.b8p+4 0x1.b8p+4 0xd.cp+1
 -0x1.b8p+4 -0x1.b8p+4 -0xd.cp+1
 0.000000e+00 2.750000e+01 -2.750000e+01
