Vou reformular a pergunta pq acho que entederei mais facil
ArithmeticException lança exceção em raiz quadrada de numeros menores que 1? Na divisao por zero a classe lança mas n estah funcionando no método da tangente
Returns the correctly rounded positive square root of a double value. Special cases:
* If the argument is NaN or less than zero, then the result is NaN.
* If the argument is positive infinity, then the result is positive infinity.
* If the argument is positive zero or negative zero, then the result is the same as the argument.
Otherwise, the result is the double value closest to the true mathematical square root of the argument value.
Parameters:
a - a value.
Returns:
the positive square root of a. If the argument is NaN or less than zero, the result is NaN.
Olha só. No caso da raiz quadrada, o problema é que o método sqrt da classe Math não lança exceção em momento algum, mesmo quando você tenta passar um valor negativo para o método!!! :shock:
Neste caso, o método retorna o que chamamos de Not-a-Number, mais conhecido por “NaN”. Este NaN é representado em Java por uma constante do tipo double com o mesmo nome, disponibilizada pela classe Double.
Uma maneira para forçar seu método a lançar alguma exceção seria a seguinte:
public double squareRoot() {
if(Double.isNaN(num))
throw new ArithmeticException("Value is not a number");
double result = Math.sqrt(num);
if(Double.isNaN(result))
throw new ArithmeticException("Value is negative");
return result;
}
Ou seja, você deve verificar se o valor retornado é um NaN, através do método Double.isNaN(double). Se for, você lança uma exceção, ou faz o que quiser.
No caso do seno e cosseno, provavelmente deve ser a mesma coisa, caso vc esteja novamente utilizando métodos da classe Math. Se aos métodos sin e cos for passado um NaN ou um número infinito (Double.NEGATIVE_INFINITY ou Double.POSITIVE_INFINITY), será retornado por esses métodos o bendito NaN… Outro agravante é que parece que qualquer operação envolvendo um NaN, resulta em NaN, mesmo que seja, por exemplo “Double.NaN / 0”.
Tente contornar a situação sempre verificando se o resultado da conta se equipara ao Double.NaN. Obs: Não compare um double diretamente com o Double.NaN. Não sei por quê, mas não funciona… Utilize o Double.isNaN(double)