int testDecDouble() { int i; decDouble a, b; decContext set; char string[DECDOUBLE_String]; decContextDefault(&set, DEC_INIT_DECDOUBLE); // initialize decDoubleFromString(&a, "0.13", &set); decDoubleFromString(&b, "8.7", &set); for (i = 0; i < 10; i++) decDoubleAdd(&b, &a, &b, &set); // b += a; decDoubleToString(&b, string); printf("dec064: 8.7 + 0.13 * 10 => %s\n", string); return 0; }
Datum decimal64_in(PG_FUNCTION_ARGS) { char *s = PG_GETARG_CSTRING(0); PGDecimal64 ret; DECLARE_DEC_CTXT(DEC_INIT_DECIMAL64); decDoubleFromString(&ret, s, &dc); DEC_CHK_STATUS(dc, DEC_STATUS_ALL, "invalid decimal64 syntax:%s", s); PG_RETURN_DECIMAL64(ret); }
Datum numeric_decimal64(PG_FUNCTION_ARGS) { char *buf; PGDecimal64 ret; DECLARE_DEC_CTXT(DEC_INIT_DECIMAL64); buf = DatumGetCString(DirectFunctionCall1(numeric_out, PG_GETARG_DATUM(0))); decDoubleFromString(&ret, buf, &dc); DEC_CHK_STATUS(dc, DEC_STATUS_ALL, "invalid decimal64:\"%s\"", buf); pfree(buf); PG_RETURN_DECIMAL64(ret); }
Datum int8_decimal64(PG_FUNCTION_ARGS) { int64_t a = PG_GETARG_INT64(0); PGDecimal64 ret; char s[128]; DECLARE_DEC_CTXT(DEC_INIT_DECIMAL64); sprintf(s, INT64_FORMAT, a); decDoubleFromString(&ret, s, &dc); DEC_CHK_STATUS(dc, DEC_STATUS_ALL, "invalid decimal64 syntax:\"%s\"", s); PG_RETURN_DECIMAL64(ret); }
Datum float8_decimal64(PG_FUNCTION_ARGS) { double d = PG_GETARG_FLOAT8(0); PGDecimal64 ret; char s[128]; DECLARE_DEC_CTXT(DEC_INIT_DECIMAL64); sprintf(s, "%.*g", DBL_DIG, d); decDoubleFromString(&ret, s, &dc); DEC_CHK_STATUS(dc, DEC_STATUS_ALL, "invalid decimal64 syntax:\"%s\"", s); PG_RETURN_DECIMAL64(ret); }