diff --git a/src/backend/utils/adt/formatting.c b/src/backend/utils/adt/formatting.c
new file mode 100644
index 40a353f..25b247e
*** a/src/backend/utils/adt/formatting.c
--- b/src/backend/utils/adt/formatting.c
***************
*** 113,125 ****
  #define DCH_MAX_ITEM_SIZ	   12		/* max localized day name		*/
  #define NUM_MAX_ITEM_SIZ		8		/* roman number (RN has 15 chars)	*/
  
- /* ----------
-  * More is in float.c
-  * ----------
-  */
- #define MAXFLOATWIDTH	60
- #define MAXDOUBLEWIDTH	500
- 
  
  /* ----------
   * Format parser structs
--- 113,118 ----
*************** int4_to_char(PG_FUNCTION_ARGS)
*** 5214,5221 ****
  		/* we can do it easily because float8 won't lose any precision */
  		float8		val = (float8) value;
  
! 		orgnum = (char *) palloc(MAXDOUBLEWIDTH + 1);
! 		snprintf(orgnum, MAXDOUBLEWIDTH + 1, "%+.*e", Num.post, val);
  
  		/*
  		 * Swap a leading positive sign for a space.
--- 5207,5213 ----
  		/* we can do it easily because float8 won't lose any precision */
  		float8		val = (float8) value;
  
! 		orgnum = psprintf("%+.*e", Num.post, val);
  
  		/*
  		 * Swap a leading positive sign for a space.
*************** float4_to_char(PG_FUNCTION_ARGS)
*** 5414,5420 ****
  		numstr = orgnum = int_to_roman((int) rint(value));
  	else if (IS_EEEE(&Num))
  	{
- 		numstr = orgnum = (char *) palloc(MAXDOUBLEWIDTH + 1);
  		if (isnan(value) || is_infinite(value))
  		{
  			/*
--- 5406,5411 ----
*************** float4_to_char(PG_FUNCTION_ARGS)
*** 5428,5442 ****
  		}
  		else
  		{
! 			snprintf(orgnum, MAXDOUBLEWIDTH + 1, "%+.*e", Num.post, value);
  
  			/*
  			 * Swap a leading positive sign for a space.
  			 */
! 			if (*orgnum == '+')
! 				*orgnum = ' ';
! 
! 			numstr = orgnum;
  		}
  	}
  	else
--- 5419,5447 ----
  		}
  		else
  		{
! 			numstr = psprintf("%+.*e", Num.post, value);
! 
! 			/* prevent the display of imprecise/junk digits */
! 			if (Num.pre + Num.post > FLT_DIG)
! 			{
! 				int		digits = 0;
! 				char   *numstr_p;
! 
! 				for (numstr_p = numstr; *numstr_p && *numstr_p != 'e'; numstr_p++)
! 				{
! 					if (isdigit(*numstr_p))
! 					{
! 						if (++digits > FLT_DIG)
! 							*numstr_p = '0';
! 					}
! 				}
! 			}
  
  			/*
  			 * Swap a leading positive sign for a space.
  			 */
! 			if (*numstr == '+')
! 				*numstr = ' ';
  		}
  	}
  	else
*************** float4_to_char(PG_FUNCTION_ARGS)
*** 5452,5467 ****
  			Num.pre += Num.multi;
  		}
  
! 		orgnum = (char *) palloc(MAXFLOATWIDTH + 1);
! 		snprintf(orgnum, MAXFLOATWIDTH + 1, "%.0f", fabs(val));
! 		numstr_pre_len = strlen(orgnum);
  
! 		/* adjust post digits to fit max float digits */
! 		if (numstr_pre_len >= FLT_DIG)
! 			Num.post = 0;
! 		else if (numstr_pre_len + Num.post > FLT_DIG)
! 			Num.post = FLT_DIG - numstr_pre_len;
! 		snprintf(orgnum, MAXFLOATWIDTH + 1, "%.*f", Num.post, val);
  
  		if (*orgnum == '-')
  		{						/* < 0 */
--- 5457,5480 ----
  			Num.pre += Num.multi;
  		}
  
! 		/* let psprintf() do the rounding */
! 		orgnum = psprintf("%.*f", Num.post, val);
  
! 		/* prevent the display of imprecise/junk digits */
! 		if (Num.pre + Num.post > FLT_DIG)
! 		{
! 			int 	digits = 0;
! 			char   *orgnum_p;
! 
! 			for (orgnum_p = orgnum; *orgnum_p; orgnum_p++)
! 			{
! 				if (isdigit(*orgnum_p))
! 				{
! 					if (++digits > FLT_DIG)
! 						*orgnum_p = '0';
! 				}
! 			}
! 		}
  
  		if (*orgnum == '-')
  		{						/* < 0 */
*************** float8_to_char(PG_FUNCTION_ARGS)
*** 5520,5526 ****
  		numstr = orgnum = int_to_roman((int) rint(value));
  	else if (IS_EEEE(&Num))
  	{
- 		numstr = orgnum = (char *) palloc(MAXDOUBLEWIDTH + 1);
  		if (isnan(value) || is_infinite(value))
  		{
  			/*
--- 5533,5538 ----
*************** float8_to_char(PG_FUNCTION_ARGS)
*** 5534,5548 ****
  		}
  		else
  		{
! 			snprintf(orgnum, MAXDOUBLEWIDTH + 1, "%+.*e", Num.post, value);
  
  			/*
  			 * Swap a leading positive sign for a space.
  			 */
! 			if (*orgnum == '+')
! 				*orgnum = ' ';
! 
! 			numstr = orgnum;
  		}
  	}
  	else
--- 5546,5574 ----
  		}
  		else
  		{
! 			numstr = psprintf("%+.*e", Num.post, value);
! 
! 			/* prevent the display of imprecise/junk digits */
! 			if (Num.pre + Num.post > DBL_DIG)
! 			{
! 				int		digits = 0;
! 				char   *numstr_p;
! 
! 				for (numstr_p = numstr; *numstr_p && *numstr_p != 'e'; numstr_p++)
! 				{
! 					if (isdigit(*numstr_p))
! 					{
! 						if (++digits > DBL_DIG)
! 							*numstr_p = '0';
! 					}
! 				}
! 			}
  
  			/*
  			 * Swap a leading positive sign for a space.
  			 */
! 			if (*numstr == '+')
! 				*numstr = ' ';
  		}
  	}
  	else
*************** float8_to_char(PG_FUNCTION_ARGS)
*** 5557,5571 ****
  			val = value * multi;
  			Num.pre += Num.multi;
  		}
- 		orgnum = (char *) palloc(MAXDOUBLEWIDTH + 1);
- 		numstr_pre_len = snprintf(orgnum, MAXDOUBLEWIDTH + 1, "%.0f", fabs(val));
  
! 		/* adjust post digits to fit max double digits */
! 		if (numstr_pre_len >= DBL_DIG)
! 			Num.post = 0;
! 		else if (numstr_pre_len + Num.post > DBL_DIG)
! 			Num.post = DBL_DIG - numstr_pre_len;
! 		snprintf(orgnum, MAXDOUBLEWIDTH + 1, "%.*f", Num.post, val);
  
  		if (*orgnum == '-')
  		{						/* < 0 */
--- 5583,5607 ----
  			val = value * multi;
  			Num.pre += Num.multi;
  		}
  
! 		/* let psprintf() do the rounding */
! 		orgnum = psprintf("%.*f", Num.post, val);
! 
! 		/* prevent the display of imprecise/junk digits */
! 		if (Num.pre + Num.post > DBL_DIG)
! 		{
! 			int 	digits = 0;
! 			char   *orgnum_p;
! 
! 			for (orgnum_p = orgnum; *orgnum_p; orgnum_p++)
! 			{
! 				if (isdigit(*orgnum_p))
! 				{
! 					if (++digits > DBL_DIG)
! 						*orgnum_p = '0';
! 				}
! 			}
! 		}
  
  		if (*orgnum == '-')
  		{						/* < 0 */
