Незаконное деление на ноль - PullRequest
0 голосов
/ 25 октября 2011
@xyVal = (4,4,6,6,10,12,18,22,24,28,30);
@yVal = (176,178,180,184,192,202,210,218,224,232,238);

@xxVal = (9,9,9,9,9 ,11,13,15,17,19,19);
@xVal = (168,166,164,162,158,150,142,134,122,116,110);

for ($i = 0; $i <  scalar(@xVal); $i++){
    for ($i = 0; @xyVal[$i] < @xxVal[$i]; $i++){
        @yNewVal = @yVal[$i-1] + (@yVal[$i] - @yVal[$i-1])*(@xxVal[$i] - @xyVal[$i-1])/(@xyVal[$i] - @xyVal[$i-1]);
    }
}
print @yNewVal;

Я понимаю, почему он выдает ошибку Illegal division by zero о строке 9 (@yNewVal = ...)

Я хочу, чтобы в массиве было 0, если есть деление на нули. Что я делаю неправильно? Итак, как я могу избежать сбоя моего приложения при делении на ноль?

Ответы [ 4 ]

4 голосов
/ 25 октября 2011

Ваш делитель в этой строке равен @xyVal[$i] - @xyVal[$i-1], поэтому любой случай, когда у вас есть два идентичных смежных значения в @xyVAl (например, 4,4), приведет к 0, и, следовательно, к ошибке деления на ноль.

2 голосов
/ 25 октября 2011

Можно сказать:

@yNewVal = ($_ = @xyVal[$i] - @xyVal[$i-1]) == 0 ? 0 : @yVal[$i-1] + (@yVal[$i] - @yVal[$i-1])*(@xxVal[$i] - @xyVal[$i-1])/$_;
1 голос
/ 25 октября 2011

Вы можете выполнить попытку / перехват, используя eval и условные операторы.

eval {
    @yNewVal = @yVal[$i-1] + (@yVal[$i] - @yVal[$i-1])*(@xxVal[$i] - @xyVal[$i-1])/(@xyVal[$i] - @xyVal[$i-1]);
    1;
} or do {
    @yNewVal = (0);
}; 
print @yNewVal;

Хотя ваша фраза возвращает скалярное значение и помещает его в переменную массива. Так что, возможно, вы захотите пересмотреть это.

1 голос
/ 25 октября 2011

хорошо, если я вас правильно понимаю:

if (@xyVal[$i] == @xyVal[$i-1]) 
@yNewVal = 0; 
else 
@yNewVal = @yVal[$i-1] + (@yVal[$i] - @yVal[$i-1])*(@xxVal[$i] - @xyVal[$i-1])/(@xyVal[$i] - @xyVal[$i-1]);
...