Вопрос

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

У меня есть переменная-член, объявленная следующим образом:

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 варианта:

  1. Опубликованный вами код - это не тот код, который вы используете (я заметил, что у вас в системе используется нижний регистр S, поэтому он не будет компилироваться)
  2. Что-то еще изменяет значение Value на NaN до или после того, как вы выполните математические вычисления.sin

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top