По определению, дисперсия (квадрат стандартного отклонения) входных данных рассчитывается по следующему уравнению:
Проблема здесь заключается в среднее (x-bar) значение не может быть определено , пока все данные не будут прочитаны. Поэтому предполагается, что приведенное выше уравнение не подходит для фактической реализации.
На практике это уравнение преобразуется в:
, что подходит для расчета по данным.
Хотя эти уравнения теоретически эквивалентны , второе может привести к отрицательному значению из-за ошибок округления. Это может произойти, если все данные идентичны ( независимо от самого значения ).
Возможный обходной путь - установить отклонение равным нулю для отрицательного значения, как я отметил в комментарии. , Другой обходной путь - go, возвращающийся к исходному определению с:
awk 'NR==FNR {
for (i=1; i<=NF; i++)
sum[i]+=$i
next
}
# following lines are executed in the 2nd iteration
FNR==1 {
n=NR-1
for (i=1; i<=NF; i++)
mean[i]=sum[i]/n
}
{
for (i=1; i<=NF; i++)
sum2[i]+=($i-mean[i])*($i-mean[i])
}
END {
for(i=1; i<=NF; i++)
print sqrt(sum2[i]/n)
}' infile infile > outfile
, который менее эффективен, поскольку он читает данные дважды.