text: /*-------------------------------------------------------------------------
   *
   * numeric.h
   *	  Definitions for the exact numeric data type of Postgres
   *
   * Original coding 1998, Jan Wieck.  Heavily revised 2003, Tom Lane.
   *
   * Copyright (c) 1998-2018, PostgreSQL Global Development Group
   *
   * src/include/utils/numeric.h
   *
   *-------------------------------------------------------------------------
   */
  #ifndef _PG_NUMERIC_H_
  #define _PG_NUMERIC_H_
  
  #include "fmgr.h"
  
  /*
   * Limit on the precision (and hence scale) specifiable in a NUMERIC typmod.
   * Note that the implementation limit on the length of a numeric value is
   * much larger --- beware of what you use this for!
   */
  #define NUMERIC_MAX_PRECISION		1000
  
  /*
   * Internal limits on the scales chosen for calculation results
   */
  #define NUMERIC_MAX_DISPLAY_SCALE	NUMERIC_MAX_PRECISION
  #define NUMERIC_MIN_DISPLAY_SCALE	0
  
  #define NUMERIC_MAX_RESULT_SCALE	(NUMERIC_MAX_PRECISION * 2)
  
  /*
   * For inherently inexact calculations such as division and square root,
   * we try to get at least this many significant digits; the idea is to
   * deliver a result no worse than float8 would.
   */
  #define NUMERIC_MIN_SIG_DIGITS		16
  
  /* The actual contents of Numeric are private to numeric.c */
  struct NumericData;
  typedef struct NumericData *Numeric;
  
  /*
   * fmgr interface macros
   */
  
  #define DatumGetNumeric(X)		  ((Numeric) PG_DETOAST_DATUM(X))
  #define DatumGetNumericCopy(X)	  ((Numeric) PG_DETOAST_DATUM_COPY(X))
  #define NumericGetDatum(X)		  PointerGetDatum(X)
  #define PG_GETARG_NUMERIC(n)	  DatumGetNumeric(PG_GETARG_DATUM(n))
  #define PG_GETARG_NUMERIC_COPY(n) DatumGetNumericCopy(PG_GETARG_DATUM(n))
  #define PG_RETURN_NUMERIC(x)	  return NumericGetDatum(x)
  
  /*
   * Utility functions in numeric.c
   */
  extern bool numeric_is_nan(Numeric num);
  int32		numeric_maximum_size(int32 typmod);
  extern char *numeric_out_sci(Numeric num, int scale);
  extern char *numeric_normalize(Numeric num);
  
  #endif							/* _PG_NUMERIC_H_ */
  