2014-10-01 3 views
2

자바의 사인 함수에 대한 간단한 질문입니다. 값을 계산하는 방법을 아는 사람이 있습니까? I found this question about sin in Java,하지만 그것은 sin 함수가 원시 코드로 래핑되지 않은 이유를 묻습니다. 나는 완전히 다른 것을 요구하고있다. 함수가 어떻게 구현되었는지 알고 싶습니다. (가 네이티브 코드에 싸여 이후로, 나는 그것을 볼 수 없습니다.)사인은 Java로 어떻게 구현됩니까?

들이 단순히 테일러 급수 전개에서 구현나요 : 나는 수학에 대한 코드를 볼 수 없습니다

sin(x) = x - (x^3)/3! + (x^5)/5! - O(x^7) 

. sine() 함수는 원시 코드로 래핑되기 때문에

+0

인 Math.PI 상수입니다. –

+1

"fdlibm source"에 대한 인터넷 검색을 시도해보십시오. 'StrictMath'에서'sin (x)'의 정의는 그 라이브러리와 같은 알고리즘을 사용하기로되어 있습니다. 엄격하지 않은 수학의 경우, 'sin'이 컴퓨터의 부동 소수점 프로세서 (하드웨어에 따라 다름)에서 무언가를 사용하는 것이 가능하므로 정확한 알고리즘을 찾기 위해 하드웨어 정보를 찾아야합니다. – ajb

+1

'죄악'[여기] (http://developer.classpath.org/doc/java/lang/StrictMath-source.html)을 검색하십시오. – dasblinkenlight

답변

7

구현은 here(*)입니다.

sin 함수는 13도 다항식으로 근사됩니다. 즉, 형상

              C ˙ X 12 + C ˙ X 11 + ... + C ˙ X의 함수 1 + c ˙ x

간격에

[0, π/4

다음 알고리즘의 설명 같습니다

33 * Algorithm 
34 *  1. Since sin(-x) = -sin(x), we need only to consider positive x. 
35 *  2. if x < 2^-27 (hx<0x3e400000 0), return x with inexact if x!=0. 
36 *  3. sin(x) is approximated by a polynomial of degree 13 on 
37 *   [0,pi/4] 
38 *        3   13 
39 *    sin(x) ~ x + S1*x + ... + S6*x 
40 *   where 
41 * 
42 *  |sin(x)   2  4  6  8  10  12 |  -58 
43 *  |----- - (1+S1*x +S2*x +S3*x +S4*x +S5*x +S6*x )| <= 2 
44 *  | x            | 
45 * 
46 *  4. sin(x+y) = sin(x) + sin'(x')*y 
47 *     ~ sin(x) + (1-x*x/2)*y 
48 *   For better accuracy, let 
49 *     3  2  2  2  2 
50 *    r = x *(S2+x *(S3+x *(S4+x *(S5+x *S6)))) 
51 *   then     3 2 
52 *    sin(x) = x + (S1*x + (x *(r-y/2)+y)) 
53 */ 

(*) Disclamer 여기 오픈 JDK 대해 말하기

+2

죄는 내재적 인 방법이라고 생각합니다. 그래서 가능하다면 sinCPU 명령을 직접 호출하고 그 코드는 실행되지 않을 것입니다. – assylias

+0

+1. 나는 그렇지 않다면 놀랄 것이다 :-) – aioobe

+0

사실, jvm이 Java 스펙 준수를 완화 할 수있는 옵션이 없다면, 아마도 내장 함수를 사용할 수 없습니다. Java 스펙에서는 sin이 바로 이와 같은 방식으로 구현되어야합니다 (비트 정확한) 정밀도. 하드웨어에 내장 된 고속 죄 명령어가 더 정확하면 엄격한 준수를 위반하지 않고 사용할 수 없습니다. –