Skip to content

Divisão por zero ​

Métricas de desempenho quase sempre dividem por alguma coisa: tempo de resposta divide pela vazão, utilização divide pela capacidade. Quando o divisor pode chegar a zero, a execução para com erro.

O erro ​

NON_FINITE_METRIC: a métrica 'X' produziu um valor não-finito (Infinity/NaN)

A execução é interrompida de propósito. A alternativa seria devolver um resultado inválido que apareceria como um traço na tabela ou um zero no gráfico — e você não teria como distinguir de um valor legítimo.

Quando acontece de verdade ​

Aqui há uma sutileza que evita preocupação desnecessária.

A conta não é feita a cada instante. Primeiro a ferramenta calcula a média de cada quantidade ao longo da simulação, e só então faz a divisão. Veja Médias e probabilidades.

A consequência

Um lugar que fica vazio de vez em quando não causa problema: a média dele continua maior que zero. O erro acontece quando a média é zero — ou seja, quando o lugar esteve vazio praticamente o tempo todo.

Na prática, três situações:

SituaçãoPor quê
O lugar nunca recebe fichaerro de modelagem: um arco faltando, ou uma transição que nunca dispara
A simulação é curta demaisnada chegou lá ainda no tempo simulado
Análise transientenaquele instante o lugar está vazio em quase todas as repetições

A proteção ​

Envolva a divisão num IF que testa o divisor:

IF E{#Concluidos} > 0 THEN E{#Fila} / E{#Concluidos} ELSE 0

Se o divisor for zero, a métrica devolve 0 em vez de quebrar a execução.

O zero é uma resposta, não um resultado

Depois de proteger, um 0 na tabela pode significar duas coisas: o valor realmente é zero, ou a proteção entrou em ação. São situações muito diferentes, e a métrica não distingue uma da outra.

Se aparecer um zero inesperado, verifique se o divisor tem valor. É o primeiro lugar para olhar.

Melhor que proteger: não dividir pelo que pode zerar ​

A proteção evita a parada, mas não devolve a resposta certa. Quando possível, reescreva a métrica para dividir por algo que você já conhece.

Em vez de dividir pela vazão medida, multiplique pelo tempo entre chegadas, que é um parâmetro seu e nunca é zero:

(E{#Fila} + E{#EmAtendimento}) * TEMPO_ENTRE_CHEGADAS

Essa versão não precisa de proteção nenhuma, e funciona também na análise transiente. A página Medir tempo de resposta compara as duas com números.

Checklist ​

Antes de rodar, para cada métrica que tenha uma barra:

  1. O divisor pode ser zero? Se for um parâmetro seu, não pode — está seguro.
  2. Se for a média de um lugar, esse lugar recebe fichas com frequência?
  3. Se a resposta for "às vezes fica vazio", está seguro — a média é o que conta.
  4. Se for "quase sempre vazio", proteja com IF e reveja se é o lugar certo para medir.