Java Math.sin()始终生成NaN

时间:2010-03-18 15:22:31

标签: java math double nan

请原谅我,如果这是一个愚蠢的初学者问题,但我真的不明白。

我有一个像这样声明的成员变量:

public Double Value;

当我将3.14159265分配给Value并尝试计算它的正弦时,会发生这种情况:

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

事实上,这种情况发生在我尝试的每一个值 - 即使是0! 无论参数值如何,Math.sin()似乎总是产生NaN。

文档说:

  

如果参数是NaN或无穷大,则结果为NaN。

但我的观点显然不是NaN或无限!

那里发生了什么事?

更新

原来我是地球上最愚蠢的程序员。在我的项目中,整个代码当然比上面的例子复杂得多。它是一种表达式解析器&评估器和定义的数学函数我使用switch子句来决定调用哪个函数 - 我忘记了案例中的break语句导致sqrt函数用负参数执行。

正如我所说 - 地球上最愚蠢的程序员......

我接受了最顶层的答案,因为它是最好的imho。对不起家伙浪费你的时间-.-

3 个答案:

答案 0 :(得分:11)

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

输出(如预期的那样):

3.14159265
3.5897930298416118E-9

所以问题应该在其他地方,你使用的是哪个版本的JDK?是32位还是64位?中间是否有其他代码没有粘贴?

NaN获取Math.sin的唯一方法是使用inf o NaN作为参数。并且没有明确地将该值分配给您可以通过进行错误计算而获得的数字,例如:

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

这将输出:NaN两次。

两个注释:

  • 不要对变量使用大写字母(使用value,而不是Value
  • 当您需要将stings作为参数(或由其他字符串组成)时,您无需显式调用toString(),您可以执行System.out.println(value)

答案 1 :(得分:5)

这就是我得到的:

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

所以有两个选择:

  1. 您发布的代码不是您正在使用的代码(我注意到您在系统上有一个小写的S,因此无法编译)
  2. 在您执行Math.sin
  3. 之前或之后,还有其他东西正在将值的值更改为NaN

答案 2 :(得分:3)

对于初学者,您使用的是Double引用(包装器)类型,而不是double基元类型 - 为什么?您实际用于初始化Value的代码是什么(BTW,不应该以基于常见Java编码标准的大写字符开头)?我的猜测是你没有正确初始化Value。首先尝试使用double(不是Double)。