Javas Math.sin () производит NaN все время - PullRequest
0 голосов
/ 18 марта 2010

Простите, если это глупая новичок, но я действительно не понимаю.

У меня есть переменная-член, объявленная так:

public Double Value;

Когда я присваиваю 3.14159265 значение и пытаюсь вычислить синус этого, это происходит:

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 или бесконечность!

Какого черта там происходит?

UPDATE

Оказывается, я самый тупой программист на земле. В моем проекте весь код, конечно, намного сложнее, чем в примере выше. Это своего рода анализатор и оценщик выражений, и для определенных математических функций я использую предложение switch, чтобы решить, какую функцию вызывать - Я забыл оператор break в случаях , из-за которых функция sqrt выполнялась с отрицательный параметр.

Как я уже сказал - самый тупой программист на земле ...

Я принял самый лучший ответ, так как он лучший imho. Извините, ребята, что потратили ваше время -.-

Ответы [ 3 ]

11 голосов
/ 18 марта 2010
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)
  • когда вам нужны строки в качестве параметров (или составленные из других строк), вам не нужно явно вызывать toString(), вы можете сделать System.out.println(value)
5 голосов
/ 18 марта 2010

Вот что я получаю:

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. Что-то еще меняет значение Value на NaN до или после того, как вы выполните Math.sin
3 голосов
/ 18 марта 2010

Для начала вы используете ссылочный тип (обертка) Double, а не примитивный тип double - почему? Какой код вы на самом деле используете для инициализации Value (который, кстати, не должен начинаться с символа в верхнем регистре на основе общих стандартов кодирования Java)? Я предполагаю, что вы просто не инициализируете Value должным образом. Попробуйте начать с использования double (не Double).

...