0

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

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

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 子句来决定调用哪个函数 -在导致 sqrt 函数使用负参数执行的情况下,我忘记了 break 语句。

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

我接受了最高的答案,因为它是最好的恕我直言。对不起各位浪费你们的时间-.-

4

3 回答 3

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位?中间是否还有其他您没有粘贴的代码?

获得 a NaNfrom的唯一方法Math.sin是使用infoNaN作为参数。如果没有明确地将该值分配给一个数字,您只需通过错误的计算即可获得,例如:

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, not Value
  • 当您需要 stings 作为参数(或组成其他字符串)时,您不需要显式调用toString(),您可以这样做System.out.println(value)
于 2010-03-18T15:28:24.370 回答
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

所以有2个选项:

  1. 您发布的代码不是您正在使用的代码(我注意到您在系统上有一个小写的 S,所以这不会编译)
  2. 在您执行 Math.sin 之前或之后,还有其他事情将 Value 的值更改为 NaN
于 2010-03-18T15:29:48.803 回答
3

对于初学者,您使用的是Double引用(包装器)类型,而不是double原始类型 - 为什么?您实际用于初始化的代码是什么Value(顺便说一句,根据常见的 Java 编码标准,它不应该以大写字符开头)?我的猜测是你只是没有Value正确初始化。尝试从使用 a double(不是 a Double)开始。

于 2010-03-18T15:28:00.093 回答