perl中的数字问题

时间:2013-09-24 02:12:33

标签: perl rounding

我有一个整数数组(@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”)。

感谢。

1 个答案:

答案 0 :(得分: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