double VPLDataSet_u32_GetMean(VPLDataSet_u32_t const* dataset) { if (dataset->count == 0) { return 0.0; } else { return U64_TO_DOUBLE(dataset->sum) / U32_TO_DOUBLE(dataset->count); } }
double* TestUtils_random_f64s(double *buf, size_t count) { double *f64s = buf ? buf : (double*)CALLOCATE(count, sizeof(double)); for (size_t i = 0; i < count; i++) { uint64_t num = TestUtils_random_u64(); f64s[i] = U64_TO_DOUBLE(num) / UINT64_MAX; } return f64s; }
double VPLDataSet_u32_GetVariance(VPLDataSet_u32_t const* dataset) { if (dataset->count == 0) { return 0.0; } else { double mean = VPLDataSet_u32_GetMean(dataset); /* # (1/n) * sum((x_i-mean)^2) == # (1/n) * sum(x_i^2 - 2*mean*x_i + mean^2) == # (1/n) * (sum(x_i^2) - 2*mean*sum(x_i) + mean*mean*sum(1)) == # sum(x_i^2)/n - 2*mean*(mean*n)/n + mean*mean*n/n == # sum(x_i^2)/n - 2*mean*mean + mean*mean == */ return (U64_TO_DOUBLE(dataset->sum) / U32_TO_DOUBLE(dataset->count)) - (mean * mean); } }