FYI.

This story is over 5 years old.

Tecnologia

​Por que Não Podemos Dividir Por Zero

Hora de brincar com os números.
Crédito: Marinha dos EUA

Em setembro de 1997, o USS Yorktown, um navio de guerra da Marinha dos Estados Unidos, vivenciou "uma fatalidade de engenharia de rede local" durante manobras na costa da Virgínia. O cruzador de mísseis, um protótipo do programa baseado em PCs da Marinha Smart Ship, acabara de morrer na água, com seus sistemas de propulsões inutilizados. Alegadamente, o navio ficou à deriva por duas horas antes dos marinheiros retomarem o controle. O inimigo no caso foi um único "0".

Publicidade

O equipamento Smart Ship do Yorktown consistia em 27 PCs Pentium Pro de 200-MHz rodando Windows NT conectados via rede de fibra ótica de alta velocidade. O objetivo final era a automação, com os computadores substituindo cerca de 10% dos marinheiros do cruzador, e assim economizando 2,8 milhões de dólares anuais à Marinha.

A falha ocorreu por conta de um integrante humano da tripulação que inseriu o numeral 0 em um campo do banco de dados. Isto fez com o que computador tentasse dividir por 0, então travando por conta de um excedente no buffer, um erro de computação em que o sistema começa a sobrescrever slots de memórias previamente alocados, com todo tipo de resultados indesejáveis possíveis, tais como inutilizar um navio de guerra. O erro se espalhou por toda a rede.

A divisão por zero é algo peculiar, ainda mais dentro dos domínios da computação. Se, dentro da execução de determinada parte do software, um computador se depara com uma tentativa de divisão por 0, aquele 0 pode agir como um pedaço de pau enfiado no aro do pneu de uma bicicleta: uma coisa para de funcionar (a roda), então outra coisa que depende da primeira coisa (o quadro da bicicleta) para, e finalmente, a pessoa que está na bicicleta é atirada pra longe com a falha generalizada.

Sendo assim, espera-se que o programador tenha certificado de que a divisão por zero não é possível em seu software, mas muitas vezes as linguagens de programação agem como backup só pra garantir. Logo, se algum programa em Java detecta um zero no lugar errado, ele o interpretará como uma exceção, o que é ruim, mas nem tanto.

Publicidade

Dada a exceção, ao invés de permitir que o zero ilegal siga em frente e arruine tudo, o estado atual de execução do computador é salvo para que o problema possa ser corrigido e ele possa rodar normalmente após a resolução, sem que nada quebre de fato. Se a divisão por zero for encontrada em uma língua mais simples, "fundamental" (de menor nível) como C ou C++, o resultado obtido é o de "comportamento não definido". Tudo depende do contexto da divisão em si – do que depende aquela divisão em específico e por que? – e o resultado pode não ser nada ou um cruzador a naufragar.

Mas qual exatamente o problema com a divisão por zero? Nossa intuição nos diz de primeira que a divisão pelo numeral é sem sentido ou absurda – dividir algo por nada simplesmente não é um conceito de verdade. E ainda assim nos é permitido por diversas outras coisas que também soam absurdas, caso de números irracionais como pi e a raiz quadrada de dois. Também podemos dividir, legalmente, pelo infinito ou infinito negativo. Sem contar os números imaginários, uma série de numerais usados na matemática que não podem existir no mundo real dos números e contagens. Não existe raiz quadrada de -1, mas nós o fazemos assim mesmo.

Para entender o problema, precisamos reformular o que é divisão e observá-la através das lentes da multiplicação, na qual a divisão pode ser vista como uma reformulação ou rearranjo da mesma. Logo, se você tem a divisão 10/5 = 2, em termos de álgebra, ela significa o mesmo que 10 = (5) * (2), certo? As duas equações dizem exatamente a mesma coisa.

Publicidade

Agora experimente com 10/0 = x , onde x é qualquer valor imaginável. Isso significaria que x * 0 é igual a 10, mas nós sabemos que 0 vezes qualquer coisa simplesmente resulta em 0. O resultado é uma contradição, o que é a prova matemática de fato de que a divisão por zero é inválida.

A divisão por zero não tem significado dentro da própria definição de divisão

A prova pode ser reformulada em termos mais intuitivos. Pense no que é a divisão, a palavra "divisão". Significa separar coisas de outras, um caso especial de subtração. Imagine que você recebeu 10 cédulas e lhe foi instruído que você deve levar estas mesmas cédulas ao cômodo ao lado e distribuí-las igualmente entre as pessoas naquele lugar. Você dará a cada pessoa x cédulas, subtraindo esse número do total de 10. Você terá terminado a tarefa quando as cédulas forem divididas, naturalmente. Parece algo simples o bastante de se fazer.

Ou melhor, seria fácil se houvessem pessoas no tal cômodo. Ele está vazio (e você não conta). Como você divide coisas se não existem coisas? Realmente, quando dizemos que a divisão por zero é indefinida, é no sentido mais literal possível. A divisão por zero não tem significado dentro da própria definição de divisão. É algo divertido de se pensar.

De lambuja, considere um caso em especial. Quando estávamos falando sobre computadores e zeros, algo ficou de fora. O zero é ilegal geralmente apenas para dados que usam números inteiros. Ou seja, quando estamos dividindo números inteiros sem decimais ou frações. Números decimais, conhecidos como pontos flutuantes, tem uma espécie de fator de correção embutido. Então, se estamos lidando com dados de pontos flutuantes, a linguagem não só permitirá zeros como zeros positivos e negativos. Funciona da seguinte forma: a divisão pelo zero positivo resulta em infinito positivo, enquanto a divisão pelo zero negativo resulta em negativo infinito.

O propósito disto é garantir que sinais positivos e negativos sejam preservados quando um programa está lidando com minúsculos números diferentes de zero. É possível que um número seja pequeno assim, com tantos zeros, de forma que os dados não conseguem determiná-lo dentro de sua memória alocada e acaba assim armazenando um monte de zeros, com a substância numérica sendo aparada. O resultado da divisão por um número tão pequeno seria igualmente tão complicado de se armazenar, então chegamos ao infinito. Meio que faz sentido, né?

Tradução: Thiago "Índio" Silva