Cadê a lógica? 0/0

8 respostas
thisenrose

Pessoal.
Por que isto ocorre ?

double a = 0.0;
		int b = 0;
		int c = 0;

		System.out.println(a / b);
		System.out.println(b / a);
		System.out.println(c / a);
		System.out.println(c / b);

RESULTADO
NaN
NaN
NaN
Exception in thread “main” java.lang.ArithmeticException: / by zero
at Teste.main(Teste.java:12)

8 Respostas

Marlon_Meneses

uai…
matemática básica: não existe divisão por zero

drsmachado

thisenrose:
Pessoal.
Por que isto ocorre ?

double a = 0.0;
		int b = 0;
		int c = 0;

		System.out.println(a / b);
		System.out.println(b / a);
		System.out.println(c / a);
		System.out.println(c / b);

RESULTADO
NaN
NaN
NaN
Exception in thread “main” java.lang.ArithmeticException: / by zero
at Teste.main(Teste.java:12)


O que a matemática diz a respeito de divisão de um número qualquer por zero?
Qualquer calculadora furreca pode te permitir entender isso, tente fazer divisões com qualquer número por zero…

thisenrose

Ué.
Mas porque só a divisão entre inteiros que lança a exception?

Marlon_Meneses

thisenrose:
Ué.
Mas porque só a entre inteiros que lança a exception?

hum…
a dúvida é essa afinal!
bom… ai eu nao sei!
rs

acho que deve ser alguma coisa haver com a precisão

thisenrose

Deve ser pelo mesmo fato que não se deve representar valores monetários em Double mas sim Integer.
Talvez o java pense que o 0.0 na verdade seja 0.0000000000000000000000000001.

sergiotaborda

thisenrose:
Pessoal.
Por que isto ocorre ?

double a = 0.0;
		int b = 0;
		int c = 0;

		System.out.println(a / b);
		System.out.println(b / a);
		System.out.println(c / a);
		System.out.println(c / b);

RESULTADO
NaN
NaN
NaN
Exception in thread “main” java.lang.ArithmeticException: / by zero
at Teste.main(Teste.java:12)

Dã uma lida nisto que pode ajudar.

Em Inteiros 0/0 não existe, não está definido, por isso dá exception.
Em Double 0/0 não existe, mas em Double existe um valor que significa “não existe” que é o NaN ( Não é um Numero). Portanto, não dá erro, mas devolver NaN.
Usar double é perigoso por isto mesmo ( entre outras coisas) e vc não deve usar double sem um conjunto de cuidados. outros numeros que existem em double são -0 (menos zero. que não é zero) , +infinito e -infinito.
Ou seja, em double existem valores que representam limites, e isto pode ser muito louco de usar na prática, mas não é trivial.

E

Vamos explicar isso direito.

Quando dividimos 0 por 0, podemos ter duas situações:

a) Quando 0 e 0 são dois números inteiros (ou long, ou short, ou char) então é gerada uma ArithmeticException, como esperado.

b) Quando pelo menos um dos zeros é um número de ponto flutuante (como double ou float), então o resultado é um “NaN”, tal como especificado por IEEE-754.

c) Quando dividimos um número que não é zero e é de ponto flutuante por 0, podemos ter a seguinte situação:

  • O número é positivo e o zero é positivo - o resultado é +Infinity
  • O número é negativo e o zero é positivo - o resultado é -Infinity
  • O número é positivo e o zero é negativo - o resultado é -Infinity
  • O número é negativo e o zero é negativo - o resultado é +Infinity

A razão pela qual isso ocorre é que para o padrão IEEE, zero não é exatamente o zero matemático, mas sim alguma quantidade que é infinitesimalmente próxima ao zero matemático. E é por isso que quando dividimos 1.0 por 0.0, o resultado é +Infinity.

thisenrose

Obrigado a todos. :lol: :slight_smile:
Dúvida sanada.

Criado 8 de fevereiro de 2013
Ultima resposta 8 de fev. de 2013
Respostas 8
Participantes 5