1 /*------------------------------------------------------------------------- 2 * 3 * numeric.h 4 * Definitions for the exact numeric data type of Postgres 5 * 6 * Original coding 1998, Jan Wieck. Heavily revised 2003, Tom Lane. 7 * 8 * Copyright (c) 1998-2016, PostgreSQL Global Development Group 9 * 10 * src/include/utils/numeric.h 11 * 12 *------------------------------------------------------------------------- 13 */ 14 #ifndef _PG_NUMERIC_H_ 15 #define _PG_NUMERIC_H_ 16 17 #include "fmgr.h" 18 19 /* 20 * Limit on the precision (and hence scale) specifiable in a NUMERIC typmod. 21 * Note that the implementation limit on the length of a numeric value is 22 * much larger --- beware of what you use this for! 23 */ 24 #define NUMERIC_MAX_PRECISION 1000 25 26 /* 27 * Internal limits on the scales chosen for calculation results 28 */ 29 #define NUMERIC_MAX_DISPLAY_SCALE NUMERIC_MAX_PRECISION 30 #define NUMERIC_MIN_DISPLAY_SCALE 0 31 32 #define NUMERIC_MAX_RESULT_SCALE (NUMERIC_MAX_PRECISION * 2) 33 34 /* 35 * For inherently inexact calculations such as division and square root, 36 * we try to get at least this many significant digits; the idea is to 37 * deliver a result no worse than float8 would. 38 */ 39 #define NUMERIC_MIN_SIG_DIGITS 16 40 41 /* The actual contents of Numeric are private to numeric.c */ 42 struct NumericData; 43 typedef struct NumericData *Numeric; 44 45 /* 46 * fmgr interface macros 47 */ 48 49 #define DatumGetNumeric(X) ((Numeric) PG_DETOAST_DATUM(X)) 50 #define DatumGetNumericCopy(X) ((Numeric) PG_DETOAST_DATUM_COPY(X)) 51 #define NumericGetDatum(X) PointerGetDatum(X) 52 #define PG_GETARG_NUMERIC(n) DatumGetNumeric(PG_GETARG_DATUM(n)) 53 #define PG_GETARG_NUMERIC_COPY(n) DatumGetNumericCopy(PG_GETARG_DATUM(n)) 54 #define PG_RETURN_NUMERIC(x) return NumericGetDatum(x) 55 56 /* 57 * Utility functions in numeric.c 58 */ 59 extern bool numeric_is_nan(Numeric num); 60 int32 numeric_maximum_size(int32 typmod); 61 extern char *numeric_out_sci(Numeric num, int scale); 62 extern char *numeric_normalize(Numeric num); 63 64 #endif /* _PG_NUMERIC_H_ */ 65