summaryrefslogtreecommitdiff
path: root/sql/item_sum.h
diff options
context:
space:
mode:
authorunknown <tsmith/tim@siva.hindu.god>2006-12-26 16:49:10 -0700
committerunknown <tsmith/tim@siva.hindu.god>2006-12-26 16:49:10 -0700
commit6e84e11da5f4d9168005f48c90fd169047a9e950 (patch)
treee6bcbe8baaed6b27ac43fd5aa816ebe6f1e949f8 /sql/item_sum.h
parent4dabfa5de70c59c4f7ea1e4a33224c5a3f798d66 (diff)
parente87d593ae1598c4e93da59ba249bb01a649c5772 (diff)
downloadmariadb-git-6e84e11da5f4d9168005f48c90fd169047a9e950.tar.gz
Merge siva.hindu.god:/usr/home/tim/m/bk/g51
into siva.hindu.god:/usr/home/tim/m/bk/tmp/mrg51-dec26 Makefile.am: Auto merged client/mysqlbinlog.cc: Auto merged configure.in: Auto merged client/mysqltest.c: Auto merged include/config-win.h: Auto merged include/my_global.h: Auto merged include/my_pthread.h: Auto merged include/mysql.h: Auto merged include/typelib.h: Auto merged mysql-test/Makefile.am: Auto merged mysql-test/r/sp.result: Auto merged mysql-test/r/type_timestamp.result: Auto merged mysql-test/r/warnings.result: Auto merged mysys/default.c: Auto merged mysys/my_wincond.c: Auto merged mysys/typelib.c: Auto merged server-tools/instance-manager/Makefile.am: Auto merged server-tools/instance-manager/guardian.cc: Auto merged server-tools/instance-manager/instance.cc: Auto merged sql/field.cc: Auto merged sql/item_sum.cc: Auto merged sql/item_sum.h: Auto merged sql/net_serv.cc: Auto merged sql/opt_range.cc: Auto merged sql/sql_class.h: Auto merged sql/sql_parse.cc: Auto merged sql/share/charsets/hebrew.xml: Auto merged sql/sql_show.cc: Auto merged storage/federated/ha_federated.cc: Auto merged strings/conf_to_src.c: Auto merged vio/viossl.c: Auto merged sql/field.h: Manual merge sql/log_event.cc: Manual merge
Diffstat (limited to 'sql/item_sum.h')
-rw-r--r--sql/item_sum.h20
1 files changed, 14 insertions, 6 deletions
diff --git a/sql/item_sum.h b/sql/item_sum.h
index 7879838fa90..a0e4bfbb342 100644
--- a/sql/item_sum.h
+++ b/sql/item_sum.h
@@ -682,8 +682,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
{
@@ -705,6 +707,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
@@ -713,9 +723,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;
@@ -724,7 +733,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; }
@@ -744,7 +753,6 @@ public:
enum Item_result result_type () const { return REAL_RESULT; }
void cleanup()
{
- cur_dec= 0;
count= 0;
Item_sum_num::cleanup();
}