precisÃo! por favor!

Olá,

Talvez isto não seja Java avançado, mas meus conhecimentos de curso técnico não deram conta de resolver o meu problema.
Estou cursando faculdade de Engenharia Civil e a disciplina de Cálculo Numérico e agora os programas começaram a complicar.

Meu objetivo é programar o Método da Bissecção para descobrir o intervalo que contém a raíz de uma equação monstruosa, fiz o programa todo, mas estou tendo um problema:

Quando calculo exponencial de -361 [e^(-361)], o valor encontrado aparece como sendo 0, porém a função exponencial nunca é igual a 0, mas sim muito próximo de 0. Eu preciso de ajuda em como obter esse valor mais preciso (isso vai dar um número além de dez na menos 100), senão meu método não funcionará. A forma com que calculei este valor foi usando o comando Math.exp(-((x+1)*(x+1))), onde x=18.

Ajuda!!! :shock:

Uai, eu fiz as contas aqui e o Java calculou direitinho.

e^-361 = 1,6584104776811451411353056394535e-157 (na calculadora do Windows)

Math.exp (-361) = 1.6584104776811452E-157 (no Java)

Não entendi qual foi o seu problema.

(De qualquer maneira, Math.exp tem problemas para calcular uma exponencial para um número muito próximo, em valor absoluto, de 0. Nesse caso, você precisa usar Math.expm1, que calcula e^x - 1, para o caso de x ser próximo de 0.

Por exemplo, Math.expm1 (1E-10) dá o valor 1.00000000005E-10, ou seja, e^(1E-10) deveria dar 1 + 1.00000000005E-10.

Hmm… pois é, separadamente deu certo a exponencial.
Ah. falei algo errado antes… ao invés de 18 é 18 negativo. então fica e^(-289)
Mas na minha função que é Math.exp(-((x+1)(x+1)))+18x+324, com x=-18, tá dando 0.
Deveria dar igual a Math.exp(-289) - 324 + 324 = Math.exp(-289) que é diferente de 0.

Pra acrescentar, estou usando isso numa classe dessa forma:

public double f(double x) {
return (Math.exp(-((x+1)(x+1)))+18x+324);
}

Estou tentando calcular f(x), onde x é double e igual a -18.

Ah, mas assim realmente não vai dar certo. Nem tente me convencer do contrário.
O seu problema é que você quer somar um número muito pequeno a 324, e depois subtrair 324.
Como a precisão de um double é finita (cerca de 15 casas decimais), então o resultado tem de dar zero mesmo.

Ah, e como faço então. Será que devo forjar o resultado para x=-18? :?
Ou tem uma forma melhor?

Cara,

Muito obrigado, eu consegui resolver o problema talvez temporariamente.
Fiz o seguinte:

public double f(double x) {
double aux=18x+324;
return (Math.exp(-((x+1)
(x+1)))+ aux);
}

Se voltar a ter problemas volto a postar. Mas por enquanto está tudo certo, MUITO OBRIGADO!

Hum, não tinha pensado nisso. É realmente isso que você tinha de fazer.