Como pode o java achar um -0.0? (zero negativo?)

4 respostas
J

No meu codigo fazendo testes para achar erro descobri que em uma das operações matematicas que este faz lança um resultado na posição matriz[1][2] = -0.0 !!!
Mas como pode ocorrer um -0.0??? Vou passar o codigo. Por favor copilem!

class Gauss {
	
	public static void main(String [] uix){
	
	
	int n = 3;
	int n1 = n+1;
	//double [][] matriz = {{1,1,42},{1,-1,8}};
	//double [][] matriz = {{1,2,9},{7,1,9}};// ACHA A CORRETA
	//double [][] matriz = {{5.0,-2.0,11.0},{6.0,1.0,20.0}};// ACHA A CORRETA
	double [][] matriz = {{2.0,2.0,2.0,20},{2.0,-2.0,2.0,8},{2,-2,(-2),0}}; //ERRADO
	//double [][] matriz = {{10.0,5.0,3.0,17.0},{5.0,8.0,2.0,19},{2.0,3.0,8.0,0.0}}; //ERRADO
	//double [][] matriz = {{2.0,-1.0,3.0,0},{4.0,2.0,-1.0,0},{1.0,-1.0,2.0,0}}; // ACHA UM -0.0????
	double [] solucoes;
	
	//----- VERIFICA ELEMENTOS NA MATRIZ -------
	System.out.println("VERIFICA ELEMENTOS NA MATRIZ ");
	for(int i = 0; i<n; i++){
		for(int j = 0; j<=matriz.length; j++)
			System.out.println(matriz[i][j]);
	}
	
	System.out.println();
	System.out.println();
	System.out.println("--- CALCULO DO 1º LAÇO -----");
	
	//--- CALCULO DO 1º LAÇO -----
		solucoes = new double[n];
		
		
   		
		for(int k = 0; k<n-1; k++ ){
			double mkk = matriz[k][k];
			for(int j = k; j<n1; j++){
				
			    matriz[k][j]= matriz[k][j]/mkk;
			    //System.out.println(matriz[k][j]);
			    /*if(j==n1-1)
			    	for(int p = 0; p<=matriz.length; p++)
			             System.out.println(matriz[k+1][p]);*/
			}
			for(int i = k+1; i<n; i++){
				
				double cond = matriz[i][k];
				for(int j=k; j<n1; j++){
					matriz[i][j]= (matriz[i][j]) - (cond * matriz[k][j]);
					//System.out.println(matriz[1][j]);
					/*if(i==2){
					
					System.out.println("-------->>> M22"+matriz[0][2]);
					System.out.println("-------->>> cond "+ cond);
					}*/
				}
			}
		}
		/*
		
		matriz[n-1][n1-1] = matriz[n-1][n1-1]/matriz[n-1][n-1];
		System.out.println("--- VALOR EM N-1,N1-1 -----"+matriz[n-1][n1-1]);
		matriz[n-1][n-1] = 1;
		System.out.println("--- VALOR EM N-1,N-1 -----"+matriz[n-1][n-1]);
		
		
		solucoes[n-1] = matriz[n-1][n1-1];
				
		System.out.println();
		System.out.println("--- CALCULANDO AS SOLUÇÕES ----");
		for(int i = 0; i<n-1; i++){
			
			int k = n-i-1;
			solucoes[k-1] = matriz[k-1][n1-1];
			
			for(int j = k+1; j<=n; j++){
				
				solucoes[k-1] = solucoes[k-1] - ( matriz[i][j-1] * solucoes[j-1]);
				System.out.println(solucoes[k-1]);
			}
		}
		for(int i = 0; i<solucoes.length; i++)
			System.out.println("Soluções "+ solucoes[i]);
			
		*///VARRENDO A NOVA MATRIZ	
		System.out.println();
		System.out.println("--- VARRENDO A NOVA MATRIZ ----");
		for(int i = 0; i<n; i++){
		for(int j = 0; j<=matriz.length; j++)
			System.out.println(matriz[i][j]);
	    }
		
	}
}

4 Respostas

T

Qual é o seu problema com um zero negativo? Zero negativo, para o Java, é um valor tão pequeno e negativo que não pode ser representado em notação científica (como se fosse -1.2E-1024 ou coisa parecida), mas não é exatamente zero.

andredeividi

esse zero negativo nao apareceu aqui!!!

R

No meu caso aki eu sempre trato com um if

if ( valor == -0.0 ) {

J

Digo isso porque me é muito extranho! Porque até pelo que eu sei 0 é o elemento neutro na adição e absorvente na multiplicação. Ou seja, ele não interfere nestas operações.

Mas dizer que -0 é tão pequeno que não pode ser representado, sei lá… se meu algoritimo estivesse fazendo infinitas operações tal que o limite estivesse tendendo a um real negativo com trocentas casas decimais tipo -0.00000000000000000000000000000000000000000000000000000000000000005 e a mantissa não é capaz de absover este numero e o truncasse ai sim aceitaria o -0.0… ( com mais algumas casas ¬¬ ), mas como o numero de operações é extremamente limitado e os coeficientes desta matriz vão de 2 a 20 por mais que eu divida o menor num pelo maior num nunca dará um resultado negativo tão pequeno! Sei lá. Extranho!

Criado 19 de maio de 2009
Ultima resposta 19 de mai. de 2009
Respostas 4
Participantes 4