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이나 무한대가 아닙니다!
도대체 무슨 일이 일어나고 있습니까?
업데이트
지구상에서 가장 멍청한 프로그래머입니다. 내 프로젝트에서 전체 코드는 물론 위의 예보다 훨씬 더 복잡합니다. 그것은 일종의 표현식 파서 및 평가자이며 정의 된 수학적 함수의 경우 스위치 클로스를 사용하여 호출 할 기능을 결정합니다. 나는 사건에서 브레이크 진술을 잊었다 이로 인해 SQRT 기능이 음의 매개 변수로 실행되었습니다.
내가 말했듯이 - 지구상에서 가장 멍청한 프로그래머 ...
나는 그것이 최고의 IMHO이기 때문에 가장 큰 대답을 받아 들였다. 당신의 시간을 낭비한 죄송합니다 -.-
해결책
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 NaN
~에서 Math.sin
사용하는 것입니다 inf
영형 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
따라서 두 가지 옵션이 있습니다.
- 게시 한 코드는 사용중인 코드가 아닙니다 (시스템에 소문자 S가 있으므로 컴파일하지 않습니다).
- 다른 것이 수학을하기 전 또는 후에 NAN으로 가치의 가치를 바꾸고 있습니다.
우선, 당신은 그것을 사용하고 있습니다 Double
참조 (래퍼) 유형이 아닙니다 double
원시 유형 - 왜? 초기화에 실제로 사용하는 코드는 무엇입니까? Value
(BTW는 일반적인 Java 코딩 표준을 기반으로 대문자로 시작해서는 안됩니까?)? 내 생각에 당신은 단지 초기화가 아니라는 것입니다 Value
제대로. a를 사용하는 것으로 시작하십시오 double
(a Double
).