Datum decimal64_inc(PG_FUNCTION_ARGS) { PGDecimal64 a = PG_GETARG_DECIMAL64(0); PGDecimal64 one; PGDecimal64 ret; DECLARE_DEC_CTXT(DEC_INIT_DECIMAL64); decDoubleFromInt32(&one, 1); decDoubleAdd(&ret, &a, &one, &dc); PG_RETURN_DECIMAL64(ret); }
Datum decimal64_add(PG_FUNCTION_ARGS) { PGDecimal64 a = PG_GETARG_DECIMAL64(0); PGDecimal64 b = PG_GETARG_DECIMAL64(1); PGDecimal64 ret; DECLARE_DEC_CTXT(DEC_INIT_DECIMAL64); decDoubleAdd(&ret, &a, &b, &dc); DEC_CHK_STATUS(dc, DEC_STATUS_OFUF, "decimal64 overflow"); PG_RETURN_DECIMAL64(ret); }
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; }