Index: libcfa/src/iostream.cfa
===================================================================
--- libcfa/src/iostream.cfa	(revision bb1eabcd6f64b0ee41ffacd7dd40e7329004f68e)
+++ libcfa/src/iostream.cfa	(revision bc547d37653baaa8e7fac63a33cc9fe1fd2a3b0f)
@@ -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 */ \
