*
* 1998 Jan Wieck
*
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/numeric.c,v 1.49 2001/12/11 02:02:12 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/numeric.c,v 1.50 2002/02/18 14:25:40 momjian Exp $
*
* ----------
*/
* Local definitions
* ----------
*/
-#ifndef MIN
-#define MIN(a,b) (((a)<(b)) ? (a) : (b))
-#endif
-#ifndef MAX
-#define MAX(a,b) (((a)>(b)) ? (a) : (b))
-#endif
-
#ifndef NAN
#define NAN (0.0/0.0)
#endif
* Limit the scale value to avoid possible overflow in calculations
* below.
*/
- scale = MIN(NUMERIC_MAX_RESULT_SCALE,
- MAX(-NUMERIC_MAX_RESULT_SCALE, scale));
+ scale = Min(NUMERIC_MAX_RESULT_SCALE,
+ Max(-NUMERIC_MAX_RESULT_SCALE, scale));
/*
* Unpack the argument and round it at the proper digit position
/*
* Set result's scale to something reasonable.
*/
- scale = MIN(NUMERIC_MAX_DISPLAY_SCALE, MAX(0, scale));
+ scale = Min(NUMERIC_MAX_DISPLAY_SCALE, Max(0, scale));
arg.rscale = scale;
arg.dscale = scale;
* Limit the scale value to avoid possible overflow in calculations
* below.
*/
- scale = MIN(NUMERIC_MAX_RESULT_SCALE,
- MAX(-NUMERIC_MAX_RESULT_SCALE, scale));
+ scale = Min(NUMERIC_MAX_RESULT_SCALE,
+ Max(-NUMERIC_MAX_RESULT_SCALE, scale));
/*
* Unpack the argument and truncate it at the proper digit position
init_var(&arg);
set_var_from_num(num, &arg);
- arg.ndigits = MIN(arg.ndigits, MAX(0, arg.weight + scale + 1));
+ arg.ndigits = Min(arg.ndigits, Max(0, arg.weight + scale + 1));
/*
* Set result's scale to something reasonable.
*/
- scale = MIN(NUMERIC_MAX_DISPLAY_SCALE, MAX(0, scale));
+ scale = Min(NUMERIC_MAX_DISPLAY_SCALE, Max(0, scale));
arg.rscale = scale;
arg.dscale = scale;
set_var_from_num(num, &arg);
- res_dscale = MAX(arg.dscale, NUMERIC_MIN_DISPLAY_SCALE);
- res_dscale = MIN(res_dscale, NUMERIC_MAX_DISPLAY_SCALE);
- global_rscale = MAX(arg.rscale, NUMERIC_MIN_RESULT_SCALE);
- global_rscale = MAX(global_rscale, res_dscale + 4);
- global_rscale = MIN(global_rscale, NUMERIC_MAX_RESULT_SCALE);
+ res_dscale = Max(arg.dscale, NUMERIC_MIN_DISPLAY_SCALE);
+ res_dscale = Min(res_dscale, NUMERIC_MAX_DISPLAY_SCALE);
+ global_rscale = Max(arg.rscale, NUMERIC_MIN_RESULT_SCALE);
+ global_rscale = Max(global_rscale, res_dscale + 4);
+ global_rscale = Min(global_rscale, NUMERIC_MAX_RESULT_SCALE);
sqrt_var(&arg, &result);
init_var(&result);
set_var_from_num(num, &arg);
- res_dscale = MAX(arg.dscale, NUMERIC_MIN_DISPLAY_SCALE);
- res_dscale = MIN(res_dscale, NUMERIC_MAX_DISPLAY_SCALE);
- global_rscale = MAX(arg.rscale, NUMERIC_MIN_RESULT_SCALE);
- global_rscale = MAX(global_rscale, res_dscale + 4);
- global_rscale = MIN(global_rscale, NUMERIC_MAX_RESULT_SCALE);
+ res_dscale = Max(arg.dscale, NUMERIC_MIN_DISPLAY_SCALE);
+ res_dscale = Min(res_dscale, NUMERIC_MAX_DISPLAY_SCALE);
+ global_rscale = Max(arg.rscale, NUMERIC_MIN_RESULT_SCALE);
+ global_rscale = Max(global_rscale, res_dscale + 4);
+ global_rscale = Min(global_rscale, NUMERIC_MAX_RESULT_SCALE);
exp_var(&arg, &result);
init_var(&result);
set_var_from_num(num, &arg);
- res_dscale = MAX(arg.dscale, NUMERIC_MIN_DISPLAY_SCALE);
- res_dscale = MIN(res_dscale, NUMERIC_MAX_DISPLAY_SCALE);
- global_rscale = MAX(arg.rscale, NUMERIC_MIN_RESULT_SCALE);
- global_rscale = MAX(global_rscale, res_dscale + 4);
- global_rscale = MIN(global_rscale, NUMERIC_MAX_RESULT_SCALE);
+ res_dscale = Max(arg.dscale, NUMERIC_MIN_DISPLAY_SCALE);
+ res_dscale = Min(res_dscale, NUMERIC_MAX_DISPLAY_SCALE);
+ global_rscale = Max(arg.rscale, NUMERIC_MIN_RESULT_SCALE);
+ global_rscale = Max(global_rscale, res_dscale + 4);
+ global_rscale = Min(global_rscale, NUMERIC_MAX_RESULT_SCALE);
ln_var(&arg, &result);
set_var_from_num(num1, &arg1);
set_var_from_num(num2, &arg2);
- res_dscale = MAX(arg1.dscale + arg2.dscale, NUMERIC_MIN_DISPLAY_SCALE);
- res_dscale = MIN(res_dscale, NUMERIC_MAX_DISPLAY_SCALE);
- global_rscale = MAX(arg1.rscale + arg2.rscale, NUMERIC_MIN_RESULT_SCALE);
- global_rscale = MAX(global_rscale, res_dscale + 4);
- global_rscale = MIN(global_rscale, NUMERIC_MAX_RESULT_SCALE);
+ res_dscale = Max(arg1.dscale + arg2.dscale, NUMERIC_MIN_DISPLAY_SCALE);
+ res_dscale = Min(res_dscale, NUMERIC_MAX_DISPLAY_SCALE);
+ global_rscale = Max(arg1.rscale + arg2.rscale, NUMERIC_MIN_RESULT_SCALE);
+ global_rscale = Max(global_rscale, res_dscale + 4);
+ global_rscale = Min(global_rscale, NUMERIC_MAX_RESULT_SCALE);
/*
* Call log_var() to compute and return the result
set_var_from_num(num1, &arg1);
set_var_from_num(num2, &arg2);
- res_dscale = MAX(arg1.dscale + arg2.dscale, NUMERIC_MIN_DISPLAY_SCALE);
- res_dscale = MIN(res_dscale, NUMERIC_MAX_DISPLAY_SCALE);
- global_rscale = MAX(arg1.rscale + arg2.rscale, NUMERIC_MIN_RESULT_SCALE);
- global_rscale = MAX(global_rscale, res_dscale + 4);
- global_rscale = MIN(global_rscale, NUMERIC_MAX_RESULT_SCALE);
+ res_dscale = Max(arg1.dscale + arg2.dscale, NUMERIC_MIN_DISPLAY_SCALE);
+ res_dscale = Min(res_dscale, NUMERIC_MAX_DISPLAY_SCALE);
+ global_rscale = Max(arg1.rscale + arg2.rscale, NUMERIC_MIN_RESULT_SCALE);
+ global_rscale = Max(global_rscale, res_dscale + 4);
+ global_rscale = Min(global_rscale, NUMERIC_MAX_RESULT_SCALE);
/*
* Call log_var() to compute and return the result
}
}
else
- var->ndigits = MAX(0, MIN(i, var->ndigits));
+ var->ndigits = Max(0, Min(i, var->ndigits));
/*
* Allocate space for the result
*/
- str = palloc(MAX(0, dscale) + MAX(0, var->weight) + 4);
+ str = palloc(Max(0, dscale) + Max(0, var->weight) + 4);
cp = str;
/*
/*
* Output all digits before the decimal point
*/
- i = MAX(var->weight, 0);
+ i = Max(var->weight, 0);
d = 0;
while (i >= 0)
return result;
}
- n = MAX(0, MIN(var->ndigits, var->weight + var->rscale + 1));
+ n = Max(0, Min(var->ndigits, var->weight + var->rscale + 1));
/* truncate leading zeroes */
while (n > 0 && *digit == 0)
}
}
else
- var->ndigits = MAX(0, MIN(i, var->ndigits));
+ var->ndigits = Max(0, Min(i, var->ndigits));
/*
* Check for overflow - note we can't do this before rounding, because
* ----------
*/
zero_var(result);
- result->rscale = MAX(var1->rscale, var2->rscale);
- result->dscale = MAX(var1->dscale, var2->dscale);
+ result->rscale = Max(var1->rscale, var2->rscale);
+ result->dscale = Max(var1->dscale, var2->dscale);
break;
case 1:
* ----------
*/
zero_var(result);
- result->rscale = MAX(var1->rscale, var2->rscale);
- result->dscale = MAX(var1->dscale, var2->dscale);
+ result->rscale = Max(var1->rscale, var2->rscale);
+ result->dscale = Max(var1->dscale, var2->dscale);
break;
case 1:
* ----------
*/
zero_var(result);
- result->rscale = MAX(var1->rscale, var2->rscale);
- result->dscale = MAX(var1->dscale, var2->dscale);
+ result->rscale = Max(var1->rscale, var2->rscale);
+ result->dscale = Max(var1->dscale, var2->dscale);
break;
case 1:
* ----------
*/
zero_var(result);
- result->rscale = MAX(var1->rscale, var2->rscale);
- result->dscale = MAX(var1->dscale, var2->dscale);
+ result->rscale = Max(var1->rscale, var2->rscale);
+ result->dscale = Max(var1->dscale, var2->dscale);
break;
case 1:
* The minimum and maximum scales are compile time options from
* numeric.h):
*
- * DR = MIN(MAX(D1 + D2, MIN_DISPLAY_SCALE), MAX_DISPLAY_SCALE)
- * SR = MIN(MAX(MAX(S1 + S2, DR + 4), MIN_RESULT_SCALE), MAX_RESULT_SCALE)
+ * DR = Min(Max(D1 + D2, MIN_DISPLAY_SCALE), MAX_DISPLAY_SCALE)
+ * SR = Min(Max(Max(S1 + S2, DR + 4), MIN_RESULT_SCALE), MAX_RESULT_SCALE)
*
* By default, any result is computed with a minimum of 34 digits
* after the decimal point or at least with 4 digits more than
* ----------
*/
res_dscale = var1->dscale + var2->dscale;
- res_dscale = MAX(res_dscale, NUMERIC_MIN_DISPLAY_SCALE);
- res_dscale = MIN(res_dscale, NUMERIC_MAX_DISPLAY_SCALE);
+ res_dscale = Max(res_dscale, NUMERIC_MIN_DISPLAY_SCALE);
+ res_dscale = Min(res_dscale, NUMERIC_MAX_DISPLAY_SCALE);
res_rscale = var1->rscale + var2->rscale;
- res_rscale = MAX(res_rscale, res_dscale + 4);
- res_rscale = MAX(res_rscale, NUMERIC_MIN_RESULT_SCALE);
- res_rscale = MIN(res_rscale, NUMERIC_MAX_RESULT_SCALE);
+ res_rscale = Max(res_rscale, res_dscale + 4);
+ res_rscale = Max(res_rscale, NUMERIC_MIN_RESULT_SCALE);
+ res_rscale = Min(res_rscale, NUMERIC_MAX_RESULT_SCALE);
global_rscale = res_rscale;
return res_dscale;
tmp.dscale = div_dscale;
/* do trunc() by forgetting digits to the right of the decimal point */
- tmp.ndigits = MAX(0, MIN(tmp.ndigits, tmp.weight + 1));
+ tmp.ndigits = Max(0, Min(tmp.ndigits, tmp.weight + 1));
global_rscale = var2->rscale + tmp.rscale;
sub_var(var1, &tmp, result);
- result->dscale = MAX(var1->dscale, var2->dscale);
+ result->dscale = Max(var1->dscale, var2->dscale);
global_rscale = save_global_rscale;
free_var(&tmp);
set_var_from_var(var, &tmp);
tmp.rscale = 0;
- tmp.ndigits = MIN(tmp.ndigits, MAX(0, tmp.weight + 1));
+ tmp.ndigits = Min(tmp.ndigits, Max(0, tmp.weight + 1));
if (tmp.sign == NUMERIC_POS && cmp_var(var, &tmp) != 0)
add_var(&tmp, &const_one, &tmp);
set_var_from_var(var, &tmp);
tmp.rscale = 0;
- tmp.ndigits = MIN(tmp.ndigits, MAX(0, tmp.weight + 1));
+ tmp.ndigits = Min(tmp.ndigits, Max(0, tmp.weight + 1));
if (tmp.sign == NUMERIC_NEG && cmp_var(var, &tmp) != 0)
sub_var(&tmp, &const_one, &tmp);
NumericDigit *var1digits = var1->digits;
NumericDigit *var2digits = var2->digits;
- res_weight = MAX(var1->weight, var2->weight) + 1;
- res_rscale = MAX(var1->rscale, var2->rscale);
- res_dscale = MAX(var1->dscale, var2->dscale);
+ res_weight = Max(var1->weight, var2->weight) + 1;
+ res_rscale = Max(var1->rscale, var2->rscale);
+ res_dscale = Max(var1->dscale, var2->dscale);
res_ndigits = res_rscale + res_weight + 1;
if (res_ndigits <= 0)
res_ndigits = 1;
NumericDigit *var2digits = var2->digits;
res_weight = var1->weight;
- res_rscale = MAX(var1->rscale, var2->rscale);
- res_dscale = MAX(var1->dscale, var2->dscale);
+ res_rscale = Max(var1->rscale, var2->rscale);
+ res_dscale = Max(var1->dscale, var2->dscale);
res_ndigits = res_rscale + res_weight + 1;
if (res_ndigits <= 0)
res_ndigits = 1;