Tipo de Dados - Representação

5 respostas
L

Boa Noite Galera.

Sou entusiasta em Java e agora estou tendo o primeiro contato na faculdade. Estou resolvendo alguns problemas (aqueles matemáticos que muitos de vocês já resolveram um dia), estou com problemas e antes de perguntar para alguém resolvi dar uma pesquisada e também em algum fórum.
Como minha dúvida é mais específica ficou difícil encontrar respostas utilizando a busca, achei algo sobre BigDecimal, conversão de strings ou coisas do tipo que não resolveram meu problema.

Bom, é o seguinte, tenho que fazer um programa que calcule a seguinte fórmula:

Somatório = 2^1/50 + 2^2/49 + 2^3/48 + 2^4/47 … somando até 2^50/1

Sem problemas quanto ao algoritmo, estou fazendo um while que incrementa o denominador, e um for dentro deste while que calcula o numerador de acordo com a variável de controle (i). O problema é que quando vou exibir o resultado da soma obtenho a palavra “Infinity”. Pois bem, criei um println para a cada passada do laço me mostrar o valor parcial da soma, a fim de “debugar” o código e noite que o resultado é exibido corretamente até a passada 45 do laço (o que é um número monstruoso). Desde então venho querendo resolver esse problema, já tentei trocar o tipo de dados para long, double, float… já tentei usar BigDecimal (esse nao sei se usei certo pois não conhecia o que estava fazendo, somente colei de um outro site). Não sei mais o que fazer.

Bom, se alguém aí puder ajudar eu fico grato.

Muito Obrigado.

5 Respostas

infomoz

Bem, acho que voce nao precisa do for dentro do while para resolver isso.

Tenta fazer assim:

j=50;

i=1;
soma=0;

while(i<=50){

  soma=soma+2^i/j;

}

So assim deve resolver teu problema, e o resultado nao sera tao grande assim(acho)

vou tentar aqui e vejo no que da.

A proxima aula que vou publicar no meu curso basico de JAVA vai ser mesmo sobre operacoes matemáticas. Sai na proxima terça. Pode ser útil:
[url]http://infomoz.net/cursos-livros/curso-basico-de-java/[/url]

L

Obrigado pela resposta amigo!

É eu fiz o for dentro do while pois até 50 eu preciso incrementar o denominador… de 50 em diante não…
Então estou fazendo o seguinte… Na primeira passada do laço eu cálculo diretamente os numeros (1/1 + 3/2), já na segunda passada eu verifico se o denominador é maior ou igual que 50, se sim, caio numa faixa de cálculo onde o denominador é 50, se não, eu incremento o denominador e faço o cálculo.

Bom, aceito mais sugestões!
Obrigado pela resposta!

L

Alguém mais pode me ajudar?

B
package guj;

public class TesteSomatoria {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		double soma = 0;
		for (int i = 1; i <= 50; ++i) {
			soma += Math.pow (2, i) / (50 - i + 1);
		}
		System.out.printf ("soma = %.10e %n", soma);
	}

}

A resposta:

soma = 1.5608286920e+15

Provavelmente o professor não quer que use Math.pow, mas aí só escrevi esse programa para saber o resultado.

L

bezier curve:

Provavelmente o professor não quer que use Math.pow, mas aí só escrevi esse programa para saber o resultado.

KKKK… acertou…

Cara, compilei e funcionou perfeitamente… agora vou bater teu código com o meu pra ver onde eu fiz a M…

Muito OBRIGADO pela resposta… foi de grande valia…
Alguns pontos que atentei foi q vc usou um package… q acredito que seja alguma forma de organizar os programas (classes) dentro do hd (dei uma lida rápida num artigo da wikipedia).
Vc usou printf ao invés de println, o que ao meu ver é para imprimir uma string formatada ao inves de jogar pra saida padrão, estou certo?

Também voce formatou a saida já no printf… show de bola… estou gostando de programar em java (apesar de engatinha por enquanto).

Muito Obrigado

Criado 9 de setembro de 2011
Ultima resposta 11 de set. de 2011
Respostas 5
Participantes 3