The previous coding could overrun the provided buffer size for a very large
input, or lose precision for a very small input.  Adopt the methodology
that's been in use in the equivalent backend code for a long time.
Per private report from Bas van Schaik.  Back-patch to all supported
branches.
 
 #include "postgres_fe.h"
 #include <ctype.h>
+#include <float.h>
 #include <limits.h>
 
 #include "extern.h"
 int
 PGTYPESnumeric_from_double(double d, numeric *dst)
 {
-   char        buffer[100];
+   char        buffer[DBL_DIG + 100];
    numeric    *tmp;
    int         i;
 
-   if (sprintf(buffer, "%f", d) == 0)
+   if (sprintf(buffer, "%.*g", DBL_DIG, d) <= 0)
        return -1;
 
    if ((tmp = PGTYPESnumeric_from_asc(buffer, NULL)) == NULL)