1

我有一个整数数组(@BondLength),每个整数大约有 14 位:

1.4913648111713
1.49444103262725
1.49324445420032
1.49781641064584
1.49375901670919
1.48388476641551
1.49205194279556
1.48573550809019
1.48486531375745
1.48899462725693
1.48455818343371
1.49451162591664
1.49687975468973
1.48919777061343
1.48460466118088

我把它们作为“数据”字段,加上它们的“平均值”(我也成功地达到了 10 位)到一个子程序中:

sub stdev{
    my($data) = @_;
    my $average = $_;
    if(@$data == 1){
            return 0;
    }
    my $sqtotal = 0;
    foreach(@$data) {
            $sqtotal += ($average-$_) ** 2;
    }
    my $std = ($sqtotal / (@$data-1)) ** 0.5;
    return $std;
}

但是当我用必要的参数调用这个子程序时:

 my $stdev = &stdev(@BondLength, $average);
printf("\nThe standard deviation NCABondLength: $stdev");

我得到简单的“0”输出。我知道它的值大于零,直到小数点后十位,因为我将它输入到 Excel 中。我在这个脚本中做错了什么?(我现在通过阅读网上的东西来修改它太多了,但仍然保持“0”)。

谢谢。

4

1 回答 1

3

您的代码的第二行有问题。当您说时,您只从参数列表中分配一个值my($data) = @_

这就是您的子例程返回零值的原因。你可以试试这个。

#!/usr/bin/perl
use strict;
use warnings;

sub average {
    my $data = shift;
    my $count = @$data;
    my $sum;
    foreach my $element (@$data){
            $sum += $element;
    }
    return $sum / $count;
}


sub stdev {
    my ($average, $data) = @_;
    my $count = @$data;
    my $sum;
    my $variance;
    $sum += (($_ - $average) ** 2) foreach @$data;
    $variance = $sum / $count;
    return $variance ** 0.5;

}

}
my @array = qw/
1.4913648111713
1.49444103262725
1.49324445420032
1.49781641064584
1.49375901670919
1.48388476641551
1.49205194279556
1.48573550809019
1.48486531375745
1.48899462725693
1.48455818343371
1.49451162591664
1.49687975468973
1.48919777061343
1.48460466118088
/;

my $average = average(\@array);

my $deviation = stdev($average, \@array);

printf "Standard deviation is %.5f\n", $deviation; #print number to five decimal places.
#output 0.00461
于 2013-09-24T03:11:26.043 回答