X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Fcrosstabs.q;h=801b128b8a4ad1c5e0398caa897a4cee0a869f08;hb=1fe087cbcce6a9eb41928b7af6b58c7a2aac47f8;hp=5277e54528820be8b1efb783c1e31d38a2b14344;hpb=7a887989fb1da56ebd264ee3338c1472c7e40a51;p=pspp diff --git a/src/language/stats/crosstabs.q b/src/language/stats/crosstabs.q index 5277e54528..801b128b8a 100644 --- a/src/language/stats/crosstabs.q +++ b/src/language/stats/crosstabs.q @@ -520,10 +520,11 @@ precalc (struct casereader *input, const struct dataset *ds) { struct ccase c; - if (!casereader_peek (input, 0, &c)) - return; - output_split_file_values (ds, &c); - case_destroy (&c); + if (casereader_peek (input, 0, &c)) + { + output_split_file_values (ds, &c); + case_destroy (&c); + } if (mode == GENERAL) { @@ -636,12 +637,14 @@ calc_general (struct ccase *c, const struct dataset *ds) te->values[j].f = case_num (c, x->vars[j]); else { - memcpy (te->values[j].s, case_str (c, x->vars[j]), - var_get_width (x->vars[j])); + size_t n = var_get_width (x->vars[j]); + if (n > MAX_SHORT_STRING) + n = MAX_SHORT_STRING; + memcpy (te->values[j].s, case_str (c, x->vars[j]), n); /* Necessary in order to simplify comparisons. */ memset (&te->values[j].s[var_get_width (x->vars[j])], 0, - sizeof (union value) - var_get_width (x->vars[j])); + sizeof (union value) - n); } } } @@ -1858,7 +1861,6 @@ display_crosstabulation (void) tab_offset (table, -1, tab_row (table) - num_cells * n_rows); for (r = 0; r < n_rows; r++) { - char suffix = 0; bool mark_missing = false; if (cmd.miss == CRS_REPORT @@ -1867,6 +1869,7 @@ display_crosstabulation (void) for (i = 0; i < num_cells; i++) { + char suffix = 0; double v; switch (cells[i]) @@ -1875,7 +1878,7 @@ display_crosstabulation (void) v = row_tot[r]; break; case CRS_CL_ROW: - v = 100.; + v = 100.0; suffix = '%'; break; case CRS_CL_COLUMN: @@ -1913,7 +1916,6 @@ display_crosstabulation (void) { double ct = c < n_cols ? col_tot[c] : W; bool mark_missing = false; - char suffix = 0; int i; if (cmd.miss == CRS_REPORT && c < n_cols @@ -1922,13 +1924,13 @@ display_crosstabulation (void) for (i = 0; i < num_cells; i++) { + char suffix = 0; double v; switch (cells[i]) { case CRS_CL_COUNT: v = ct; - suffix = '%'; break; case CRS_CL_ROW: v = ct / W * 100.; @@ -1951,7 +1953,7 @@ display_crosstabulation (void) NOT_REACHED (); } - format_cell_entry (table, c, i, v, suffix, mark_missing); + format_cell_entry (table, c, i, v, suffix, mark_missing); } last_row = i; } @@ -2453,7 +2455,7 @@ calc_r (double *X, double *Y, double *r, double *ase_0, double *ase_1) for (sum_Xr = sum_X2r = 0., i = 0; i < n_rows; i++) { sum_Xr += X[i] * row_tot[i]; - sum_X2r += X[i] * X[i] * row_tot[i]; + sum_X2r += pow2 (X[i]) * row_tot[i]; } Xbar = sum_Xr / W; @@ -2465,11 +2467,11 @@ calc_r (double *X, double *Y, double *r, double *ase_0, double *ase_1) Ybar = sum_Yc / W; S = sum_XYf - sum_Xr * sum_Yc / W; - SX = sum_X2r - sum_Xr * sum_Xr / W; - SY = sum_Y2c - sum_Yc * sum_Yc / W; + SX = sum_X2r - pow2 (sum_Xr) / W; + SY = sum_Y2c - pow2 (sum_Yc) / W; T = sqrt (SX * SY); *r = S / T; - *ase_0 = sqrt ((sum_X2Y2f - (sum_XYf * sum_XYf) / W) / (sum_X2r * sum_Y2c)); + *ase_0 = sqrt ((sum_X2Y2f - pow2 (sum_XYf) / W) / (sum_X2r * sum_Y2c)); { double s, c, y, t; @@ -2559,9 +2561,9 @@ calc_symmetric (double v[N_SYMMETRIC], double ase[N_SYMMETRIC], Dr = Dc = W * W; for (r = 0; r < n_rows; r++) - Dr -= row_tot[r] * row_tot[r]; + Dr -= pow2 (row_tot[r]); for (c = 0; c < n_cols; c++) - Dc -= col_tot[c] * col_tot[c]; + Dc -= pow2 (col_tot[c]); } { @@ -3070,10 +3072,10 @@ calc_directional (double v[N_DIRECTIONAL], double ase[N_DIRECTIONAL], } for (sum_ri2 = 0., i = 0; i < n_rows; i++) - sum_ri2 += row_tot[i] * row_tot[i]; + sum_ri2 += pow2 (row_tot[i]); for (sum_cj2 = 0., j = 0; j < n_cols; j++) - sum_cj2 += col_tot[j] * col_tot[j]; + sum_cj2 += pow2 (col_tot[j]); v[3] = (W * sum_fij2_ci - sum_ri2) / (W * W - sum_ri2); v[4] = (W * sum_fij2_ri - sum_cj2) / (W * W - sum_cj2); @@ -3163,9 +3165,9 @@ calc_directional (double v[N_DIRECTIONAL], double ase[N_DIRECTIONAL], for (sum_Xr = sum_X2r = 0., i = 0; i < n_rows; i++) { sum_Xr += rows[i].f * row_tot[i]; - sum_X2r += rows[i].f * rows[i].f * row_tot[i]; + sum_X2r += pow2 (rows[i].f) * row_tot[i]; } - SX = sum_X2r - sum_Xr * sum_Xr / W; + SX = sum_X2r - pow2 (sum_Xr) / W; for (SXW = 0., j = 0; j < n_cols; j++) { @@ -3173,7 +3175,7 @@ calc_directional (double v[N_DIRECTIONAL], double ase[N_DIRECTIONAL], for (cum = 0., i = 0; i < n_rows; i++) { - SXW += rows[i].f * rows[i].f * mat[j + i * n_cols]; + SXW += pow2 (rows[i].f) * mat[j + i * n_cols]; cum += rows[i].f * mat[j + i * n_cols]; } @@ -3190,7 +3192,7 @@ calc_directional (double v[N_DIRECTIONAL], double ase[N_DIRECTIONAL], for (sum_Yc = sum_Y2c = 0., i = 0; i < n_cols; i++) { sum_Yc += cols[i].f * col_tot[i]; - sum_Y2c += cols[i].f * cols[i].f * col_tot[i]; + sum_Y2c += pow2 (cols[i].f) * col_tot[i]; } SY = sum_Y2c - sum_Yc * sum_Yc / W; @@ -3200,7 +3202,7 @@ calc_directional (double v[N_DIRECTIONAL], double ase[N_DIRECTIONAL], for (cum = 0., j = 0; j < n_cols; j++) { - SYW += cols[j].f * cols[j].f * mat[j + i * n_cols]; + SYW += pow2 (cols[j].f) * mat[j + i * n_cols]; cum += cols[j].f * mat[j + i * n_cols]; }