@@ -59,7 +59,9 @@ pp_def('stdv',
5959 a2 += $a() * $a();
6060 %}
6161 if (N < 1) { $SETBAD(b()); continue; }
62- $b() = sqrt( (a2 - sa*sa/N) / N );
62+ $GENERIC() var = a2 / N - (sa/N)*(sa/N);
63+ if (var < 0) var = 0;
64+ $b() = sqrt(var);
6365 ',
6466 Doc => 'Sample standard deviation.',
6567);
@@ -77,7 +79,9 @@ pp_def('stdv_unbiased',
7779 a2 += $a() * $a();
7880 %}
7981 if (N < 2) { $SETBAD(b()); continue; }
80- $b() = pow( (a2 - sa*sa/N) / (N-1), .5 );
82+ $GENERIC() var = a2/(N-1) - sa*sa/(N*(N-1));
83+ if (var < 0) var = 0;
84+ $b() = sqrt(var);
8185 ',
8286 Doc => 'Unbiased estimate of population standard deviation.',
8387);
@@ -95,7 +99,7 @@ pp_def('var',
9599 a2 += $a() * $a();
96100 %}
97101 if (N < 1) { $SETBAD(b()); continue; }
98- $b() = ( a2 - sa*sa/N) / N ;
102+ $b() = a2 / N - sa*sa/(N*N) ;
99103 ',
100104 Doc => 'Sample variance.',
101105);
@@ -130,8 +134,9 @@ pp_def('se',
130134 sa += $a();
131135 a2 += $a() * $a();
132136 %}
133- if (N < 2) { $SETBAD(b()); continue; }
134- $b() = sqrt( (a2 - sa*sa/N) / (N*(N-1)) );
137+ $GENERIC() se2 = (a2 - sa*sa/N) / (N*(N-1));
138+ if (se2 < 0) se2 = 0;
139+ $b() = sqrt(se2);
135140 ',
136141 Doc => '
137142=for ref
@@ -275,7 +280,7 @@ pp_def('cov',
275280 sb += $b();
276281 %}
277282 if (N < 1) { $SETBAD(c()); continue; }
278- $c() = ( ab - sa*sb /N) / N ;
283+ $c() = ab / N - (sa /N) * (sb/N) ;
279284 ',
280285 Doc => 'Sample covariance. see B<corr> for ways to call',
281286);
0 commit comments