diff options
author | cmiller@zippy.cornsilk.net <> | 2006-12-22 16:02:54 -0500 |
---|---|---|
committer | cmiller@zippy.cornsilk.net <> | 2006-12-22 16:02:54 -0500 |
commit | 8ffe6fb522988aa55ba186f093dc59fbc6fb5995 (patch) | |
tree | f8e4ebcfafcd35bbf04666606c2c50a9409ffae0 /sql/item_sum.h | |
parent | 381a79f72c1384907fd2151b0b37658fef8ff72c (diff) | |
parent | 50726b2322edac8e93489fcb5ef75a5634222d44 (diff) | |
download | mariadb-git-8ffe6fb522988aa55ba186f093dc59fbc6fb5995.tar.gz |
Merge zippy.cornsilk.net:/home/cmiller/work/mysql/bug22555/my50-bug22555
into zippy.cornsilk.net:/home/cmiller/work/mysql/mysql-5.0-maint
Diffstat (limited to 'sql/item_sum.h')
-rw-r--r-- | sql/item_sum.h | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/sql/item_sum.h b/sql/item_sum.h index ad05b3c9d12..590705839b0 100644 --- a/sql/item_sum.h +++ b/sql/item_sum.h @@ -683,8 +683,10 @@ public: double val_real(); longlong val_int() { /* can't be fix_fields()ed */ return (longlong) rint(val_real()); } - String *val_str(String*); - my_decimal *val_decimal(my_decimal *); + String *val_str(String *str) + { return val_string_from_real(str); } + my_decimal *val_decimal(my_decimal *dec_buf) + { return val_decimal_from_real(dec_buf); } bool is_null() { update_null_value(); return null_value; } enum_field_types field_type() const { @@ -706,6 +708,14 @@ public: = (sum(ai^2) - 2*sum(a)*sum(a)/count(a) + count(a)*sum(a)^2/count(a)^2 )/count(a) = = (sum(ai^2) - 2*sum(a)^2/count(a) + sum(a)^2/count(a) )/count(a) = = (sum(ai^2) - sum(a)^2/count(a))/count(a) + +But, this falls prey to catastrophic cancellation. Instead, use the recurrence formulas + + M_{1} = x_{1}, ~ M_{k} = M_{k-1} + (x_{k} - M_{k-1}) / k newline + S_{1} = 0, ~ S_{k} = S_{k-1} + (x_{k} - M_{k-1}) times (x_{k} - M_{k}) newline + for 2 <= k <= n newline + ital variance = S_{n} / (n-1) + */ class Item_sum_variance : public Item_sum_num @@ -714,9 +724,8 @@ class Item_sum_variance : public Item_sum_num public: Item_result hybrid_type; - double sum, sum_sqr; - my_decimal dec_sum[2], dec_sqr[2]; int cur_dec; + double recurrence_m, recurrence_s; /* Used in recurrence relation. */ ulonglong count; uint f_precision0, f_scale0; uint f_precision1, f_scale1; @@ -725,7 +734,7 @@ public: uint prec_increment; Item_sum_variance(Item *item_par, uint sample_arg) :Item_sum_num(item_par), - hybrid_type(REAL_RESULT), cur_dec(0), count(0), sample(sample_arg) + hybrid_type(REAL_RESULT), count(0), sample(sample_arg) {} Item_sum_variance(THD *thd, Item_sum_variance *item); enum Sumfunctype sum_func () const { return VARIANCE_FUNC; } @@ -745,7 +754,6 @@ public: enum Item_result result_type () const { return REAL_RESULT; } void cleanup() { - cur_dec= 0; count= 0; Item_sum_num::cleanup(); } |