Javas Math.sin() постоянно выдает NaN
Вопрос
Простите меня, если это глупая проблема новичков, но я действительно этого не понимаю.
У меня есть переменная-член, объявленная следующим образом:
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 или infinity!
Что, черт возьми, там происходит?
Обновить
Оказывается, я самый тупой программист на земле.В моем проекте весь код, конечно, намного сложнее, чем в приведенном выше примере.Это своего рода анализатор выражений и вычислитель, и для определенных математических функций я использую switch-предложение, чтобы решить, какую функцию вызывать - Я забыл инструкцию break в случаях что привело к выполнению функции sqrt с отрицательным параметром.
Как я уже сказал - самый тупой программист на земле...
Я принял самый верхний ответ, так как это лучший имхо.Извините, ребята, что потратили ваше время впустую ...-
Решение
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)
Другие советы
Это то, что я получаю:
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 варианта:
- Опубликованный вами код - это не тот код, который вы используете (я заметил, что у вас в системе используется нижний регистр S, поэтому он не будет компилироваться)
- Что-то еще изменяет значение Value на NaN до или после того, как вы выполните математические вычисления.sin
Для начала, вы используете Double
ссылочный тип (оболочка), а не double
примитивный тип - почему?Какой код вы на самом деле используете для инициализации Value
(который, кстати, не должен начинаться с символа верхнего регистра, основанного на общих стандартах кодирования Java)?Я предполагаю, что вы просто не инициализируете Value
должным образом.Попробуйте начать с использования double
(не является Double
).