Pregunta

Perdóname si esto es un problema principiantes tonto, pero realmente no lo entiendo.

He declarado una variable miembro de esta manera:

public Double Value;

Cuando se le asigno a 3,14159265 Valor y tratar de calcular el seno de la misma, esto sucede:

system.out.println(Value.toString()); //outputs 3.14159265
Value = Math.sin(Value);
system.out.println(Value.toString()); //outputs NaN

De hecho, esto sucede con cada valor individual Probé - incluso con 0! Math.sin () parece producir siempre NaN como resultado, independientemente del valor de los argumentos.

Los documentos dicen:

  

Si el argumento es NaN o un infinito, entonces el resultado es NaN.

Pero mi argumento no es claramente NaN o infinito!

¿Qué diablos está ocurriendo allí?

Actualizar

Resulta que yo soy el programador más tonto en la tierra. En mi proyecto todo el código es por supuesto mucho más complejo que el ejemplo anterior. Es una especie de un analizador de expresiones y evaluador y de las funciones matemáticas definidas utilizo una cláusula de interruptor para decidir qué función debe llamar - He olvidado la sentencia break en los casos que provocó la función sqrt para ser ejecutado con un parámetro negativo.

Como dije - programador más tonto en la tierra ...

acepté la respuesta más alta, ya que es el mejor en mi humilde opinión. Lo siento chicos para perder su tiempo -.-

¿Fue útil?

Solución

Double value = 3.14159265;
System.out.println(value.toString()); //outputs 3.14159265
value = Math.sin(value);
System.out.println(value.toString()); //outputs NaN

salidas (como se esperaba):

3.14159265
3.5897930298416118E-9

modo problema debe estar en otro lugar, la versión de JDK está utilizando? es de 32 bits o 64 bits? ¿hay otro código en el medio que usted no pegar?

La única forma de obtener una NaN de Math.sin es mediante el uso inf o NaN como parámetro. Y sin asignar explícitamente que el valor a un número que puede obtener en sólo por hacer cálculos erróneos, por ejemplo:

Double d = 0.0/0.0;
System.out.println(Math.sin(d));
double d2 = Double.POSITIVE_INFINITY;
System.out.println(Math.sin(d2));

Esta es la salida:. NaN dos veces

Dos notas:

  • No utilice letras mayúsculas para las variables (uso value, no Value)
  • cuando se necesita picaduras como parámetros (o combinadas con otras cadenas) que no es necesario llamar explícitamente toString(), puede hacerlo System.out.println(value)

Otros consejos

Esto es lo que me sale:

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

Así que hay 2 opciones:

  1. El código que envió no es el código que está utilizando (I notar que tiene un caso S menor en el sistema, por lo que este no se compilará)
  2. Otra cosa que está cambiando el valor de Valor de NaN antes o después de hacer la Math.sin

Para empezar, se está utilizando el tipo de referencia Double (envoltorio), no es el tipo primitivo double - ¿por qué? ¿Cuál es el código que en realidad estás usando para inicializar Value (que, por cierto, no debe comenzar con un carácter en mayúscula basado en los estándares de codificación de Java comunes)? Mi conjetura es que simplemente no estás inicializar Value correctamente. Trate de comenzar con el uso de un double (no un Double).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top