Ingresso De Matemática.sin() produz NaN o tempo todo
Pergunta
Perdoe-me se isso é um idiota iniciantes problema, mas eu realmente não entendi.
Eu tenho uma variável de membro declarado da seguinte forma:
public Double Value;
Quando eu atribuir 3.14159265 de Valor e tenta calcular o seno de ele, isso acontece:
system.out.println(Value.toString()); //outputs 3.14159265
Value = Math.sin(Value);
system.out.println(Value.toString()); //outputs NaN
Na verdade, isso acontece com cada valor eu tentei, mesmo com 0!Matemática.sin() parece sempre produzir NaN como resultado, independentemente dos argumentos de valor.
O docs dizer:
Se o argumento é que a Fernanda ou o infinito, então o resultado é a Fernanda.
Mas o meu argumento é claramente não NaN ou infinito!
O que diabos está acontecendo lá?
ATUALIZAÇÃO
Acontece que eu sou a mais idiota programador na terra.No meu projeto, todo o código é, naturalmente, muito mais complexo do que o exemplo acima.É um tipo de analisador de expressão e avaliador e para o definidas as funções matemáticas de eu usar um switch-cláusula para decidir qual função chamar - Eu esqueci a instrução break nos casos o que causou a função sqrt para ser executado com o parâmetro negativo.
Como eu disse - mais idiota programador na terra...
Eu aceito a primeira resposta, pois é a melhor imho.Desculpe caras para desperdiçar o seu tempo -.-
Solução
Double value = 3.14159265;
System.out.println(value.toString()); //outputs 3.14159265
value = Math.sin(value);
System.out.println(value.toString()); //outputs NaN
saídas (conforme o esperado):
3.14159265
3.5897930298416118E-9
então o problema deve estar em outro lugar, qual a versão do JDK que você está usando?é de 32 bits ou de 64 bits?existe outro código no meio em que você não colar?
A única maneira de obter um NaN
a partir de Math.sin
é usando inf
o NaN
como o parâmetro.E sem atribuir explicitamente que o valor para um número que você pode obter em apenas fazendo o que é errado cálculos, por exemplo:
Double d = 0.0/0.0;
System.out.println(Math.sin(d));
double d2 = Double.POSITIVE_INFINITY;
System.out.println(Math.sin(d2));
este resultado será: NaN
duas vezes.
Duas notas:
- não use letras maiúsculas para as variáveis (uso
value
, nãoValue
) - quando você precisa de picadas como parâmetros (ou composto para outras cadeias de caracteres), você não precisa chamar explicitamente
toString()
, você pode fazerSystem.out.println(value)
Outras dicas
Isso é o que eu recebo:
Double Value;
Value = 3.14159265 ;
System.out.println(Value.toString()); //outputs 3.14159265
Value = Math.sin(Value);
System.out.println(Value.toString()); //outputs 3.5897930298416118E-9
Portanto, existem 2 opções:
- O código que você postou não é o código que você está usando (percebo que você tem uma caixa inferior no sistema, então isso não vai compilar)
- Outra coisa está mudando o valor do valor para NAN antes ou depois de fazer a matemática.sin
Para iniciantes, você está usando o Double
tipo de referência (wrapper), não o double
Tipo primitivo - por quê? Qual é o código que você está realmente usando para inicializar Value
(Qual, btw, não deve começar com um caractere de maiúsculas com base nos padrões de codificação Java Common)? Meu palpite é que você está simplesmente não inicializando Value
devidamente. Tente começar com o uso de um double
(não a Double
).