.NET - Dividindo por zero - Representando o infinito


Temos dois tipos de divisão por zero:

  1. a divisão de um número não nulo por zero;
  2. e a divisão de zero por zero;

Os representantes protótipos desses tipos são: a divisão 1/0 e a divisão 0/0.

Essas duas divisões tem natureza bastante distinta:

O texto abaixo, explica em detalhe a inviabilidade dessas divisões e, em particular, o significado das expressões "indefinida" e "indeterminada".

A divisão 1/0: indefinida, ou impossível, entre os números

Sendo a e b números, dizermos que a / b = c significa dizer que vale a = b . c

De modo que perguntar "quanto é um dividido por zero ? " é o mesmo que perguntar "qual número, quando multiplicado por zero, dá um ?".

Obviamente, não existe nenhum tal número e então não podemos achar um resultado numérico para 1/ 0.

Dizemos que a divisão 1 / 0 é indefinida; ou seja: é impossível escolher (definir) um número que possa ser atribuído como valor de 1/0.

A divisão 1/0: contornando a indefinição com o infinito

Como vimos acima, não existe nenhum número que possa ser visto como sendo o resultado da divisão 1/0.

Contudo, muito frequentemente vemos pessoas argumentando da seguinte maneira:

Como os quocientes

                            1/0.1 = 10 , 1/0.01 = 100 , 1/0.001 = 1000, etc

vão crescendo sem limite, poderíamos pensar num novo objeto matemático, que chamaremos de infinito e que representaria uma quantidade imensamente grande, e o qual seria visto ou definido como sendo o resultado de 1/0. Ou seja: 1/0 = infinito.

De modo que 1/0, embora 1/0 seja indefinida no conjunto dos números, ficaria definido através do objeto não numérico infinito.

O que pode-se dizer de uma tal tentativa de atribuir um resultado à divisão 1/0 ?

Bem, isso até pode ser feito. Contudo,

Examinemos isso com mais cuidado. (aqui estou representando a multiplicação pelo símbolo x)

Um exemplo de regra operatória para números que não podemos abrir mão é:     b x a/b = a

De modo que teríamos de aceitar a validade de: 0 x 1/0 = 1, ou seja: 0 x infinito = 1

Essa última igualdade produz contradições, pois teríamos: 1 = 0 x infinito = 0 x ( 2.infinito) = 2 x ( 0 . infinito ) = 2 x 1 = 2

Ou seja, acabaríamos chegando ao resultado absurdo: 1 = 2.

Assim que, no instante que aceitarmos a divisão por zero, estaremos abrindo a porta do mundo das contradições.

Concluindo :

"A divisão 1/0 é indefinida entre os números, mas pode ser definida como 1/0 = infinito. Se adotarmos essa solução, devemos estar bem cientes que a operação com o infinito provocará resultados absurdos a menos que façamos uma drástica modificação nas regras usuais de cálculo."

(retirado de: http://www.mat.ufrgs.br/~portosil/passa7d.html acessando em 02/07/2012)

A representação do infinito na plataforma .NET

Após esta apresentação de conceitos sobre a divisão por zero eu vou falar como podemos armazenar o valor infinito na plataforma .NET.

Na prática do dia a dia ao executar operações matemáticas, é possível obter um resultado que é infinito positivo ou negativo. A plataforma .NET permite este resultado e permite também o armazenamento de valores infinitos dentro estrutura de ponto flutuante.

Assim, podemos ter algumas operações matemáticas que podem retornar um valor infinito como resultado.

Por exemplo, na divisão de qualquer valor positivo por zero, o resultado é infinito. Da mesma forma, dividindo qualquer valor negativo por zero retorna um resultado de infinito negativo.

Em muitas linguagens de programação, e para alguns tipos de dados em C#, este tipo de operação gera exceção. No entanto, se você estiver usando a precisão simples ou a precisão dupla de números de ponto flutuante, o valor infinito pode ser calculado e armazenado de forma correta.

Vamos demonstrar isso na prática usando as linguagens C# e VB .NET.

Vou usar o Visual C# 2010 Express Edition e o Visual Basic 2010 Express Edition e criar aplicações do tipo Console Application com o nome DivisaoPorZeroCSharp e DivisaoPorZeroVBNET;

Abaixo temos o código de cada uma das linguagens usadas:


using System;

namespace DivizaoPorZero
{
    class Program
    {
        static void Main(string[] args)
        {
            float zero = 0;

            float positivo = 1 / zero;
            Console.WriteLine("   1/0  =  " + positivo);   
// retorna "Infinity"
           
            float negativo = -1 / zero;
            Console.WriteLine("  -1/0  =  " + negativo);   
// retorna "-Infinity"

            Console.ReadKey();
        }
    }
}
Module Module1

    Sub Main()

        Dim zero As Single = 0
        Dim positivo As Single = 1 / zero

        Console.WriteLine("  1/0  =  " & positivo)  
 'retorna "Infinity"

        Dim negativo As Single = -1 / zero

        Console.WriteLine(" -1/0  = " & negativo)  
 'retorna "Infinity"


        Console.ReadKey()

    End Sub

End Module
CSharp VB .NET

O resultado obtido para a execução do código acima será o mesmo:

Tratando o resultado infinito usando as constantes PositiveInfinity e NegativeInfinity

As estruturas float(Single para o VB .NET) e double representam o infinito usando dois campos estáticos, chamados e PositiveInfinity e NegativeInfinity.

Esses valores são constantes e podem ser diretamente atribuídos a variáveis ou utilizados para fins de comparação.

Obs: O valor destas constantes é retornado quando o resultado da operação é maior que MaxValue ( 1.7976931348623157E+308 )

Exemplo:

 double positivo = double.PositiveInfinity;
 double negativo = double.NegativeInfinity;
 Console.WriteLine(negativo == double.NegativeInfinity);
  Dim positivo As Double = Double.PositiveInfinity
  Dim negativo As Double = Double.NegativeInfinity
  Console.WriteLine(negativo == double.NegativeInfinity)
CSharp VB .NET

O resultado em ambos os casos a acima será True.

Ao invés de usar uma comparação, como mostrado acima, você pode testar se um valor é infinito usando um dos três métodos estáticos das estruturas float(Single para o VB .NET) e double.

O método IsInfinity retorna um valor booleano que será true se o valor passado como parâmetro é o infinito positivo ou negativo.

Para verificar se existe um valor infinito positivo ou negativo, você pode usar qualquer um dos métodos IsPositiveInfinity ou IsNegativeInfinity.

No exemplo a seguir vemos a aplicação dos métodos IsPositiveInfinity ou IsNegativeInfinity:

 float zero = 0;
 float positivo = 1 / zero;
 Console.WriteLine(double.IsInfinity(positivo));               
 // retorna "True"
 Console.WriteLine(double.IsPositiveInfinity(positivo));    
// retorna "True"
 Console.WriteLine(double.IsNegativeInfinity(positivo));  
// retorna "False
"
   Dim zero As Single = 0
   Dim positivo As Single = 1 / zero
   Console.WriteLine(Double.IsInfinity(positivo))            
  'retorna "True"
   Console.WriteLine(Double.IsPositiveInfinity(positivo)) 
 'retorna "True"
   Console.WriteLine(Double.IsNegativeInfinity(positivo))
 'retorna "False

CSharp VB .NET

1Ts 2:13 Por isso nós também, sem cessar, damos graças a Deus, porquanto vós, havendo recebido a palavra de Deus que de nós ouvistes, a recebestes, não como palavra de homens, mas (segundo ela é na verdade) como palavra de Deus, a qual também opera em vós que credes.

1Ts 2:14 Pois vós, irmãos, vos haveis feito imitadores das igrejas de Deus em Cristo Jesus que estão na Judéia; porque também padecestes de vossos próprios concidadãos o mesmo que elas padeceram dos judeus;

1Ts 2:15 os quais mataram ao Senhor Jesus, bem como aos profetas, e a nós nos perseguiram, e não agradam a Deus, e são contrários a todos os homens,

1Ts 2:16 e nos impedem de falar aos gentios para que sejam salvos; de modo que enchem sempre a medida de seus pecados; mas a ira caiu sobre eles afinal.

Referências:


José Carlos Macoratti