Javas Math.sin()一直生成NaN

Mil*_*lan 0 java math double nan

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

我有一个成员变量声明如下:

public Double Value;
Run Code Online (Sandbox Code Playgroud)

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

system.out.println(Value.toString()); //outputs 3.14159265
Value = Math.sin(Value);
system.out.println(Value.toString()); //outputs NaN
Run Code Online (Sandbox Code Playgroud)

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

文档说:

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

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

到底发生了什么事?

UPDATE

事实证明我是世界上最愚蠢的程序员.在我的项目中,整个代码当然比上面的例子复杂得多.它是一种表达式解析器和赋值器,对于定义的数学函数,我使用switch子句来决定调用哪个函数 - 我忘记了导致sqrt函数用负参数执行的情况下的break语句.

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

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

Jac*_*ack 11

Double value = 3.14159265;
System.out.println(value.toString()); //outputs 3.14159265
value = Math.sin(value);
System.out.println(value.toString()); //outputs NaN
Run Code Online (Sandbox Code Playgroud)

产出(如预期):

3.14159265
3.5897930298416118E-9
Run Code Online (Sandbox Code Playgroud)

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

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

Double d = 0.0/0.0;
System.out.println(Math.sin(d));
double d2 = Double.POSITIVE_INFINITY;
System.out.println(Math.sin(d2));
Run Code Online (Sandbox Code Playgroud)

这将输出:NaN两次.

两个笔记:

  • 不要使用大写字母表示变量(使用value,不是Value)
  • 当你需要stings作为参数(或组成其他字符串)时,你不需要显式调用toString(),你可以这样做System.out.println(value)


tim*_*tes 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
Run Code Online (Sandbox Code Playgroud)

所以有两个选择:

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