2013-02-20 22 views
11

Tôi đã tự hỏi nếu có bất kỳ cách nào tôi có thể truy cập vào mã gốc cho lớp Toán. Cụ thể hơn, tôi cần xem mã cho phương thức sin().mã gốc cho lớp Java Toán

+0

Bạn có muốn một trình dịch ngược không? – EAKAE

+0

Không, tôi đang tìm cách tạo phương pháp sin của riêng mình và tôi tin rằng cách thức hoạt động của lớp Math sẽ giúp ích gì. – user2089351

Trả lời

17

Điều này phụ thuộc vào việc triển khai thực hiện. Như đã nêu trong tài liệu hướng dẫn cho java.lang.Math:

Không giống như một số phương pháp số của lớp StrictMath, mọi cài đặt các chức năng tương đương với lớp Math không được định nghĩa để trả lại chút-cho-bit kết quả tương tự. Sự thư giãn này cho phép triển khai hiệu suất tốt hơn khi không yêu cầu khả năng lặp lại nghiêm ngặt.

... Trình tạo mã được khuyến khích sử dụng thư viện gốc hoặc hướng dẫn bộ vi xử lý cụ thể cho nền tảng, nếu có, để cung cấp các phương pháp thực hiện hiệu suất cao hơn theo phương pháp Math. Việc triển khai hiệu suất cao hơn như vậy vẫn phải tuân theo đặc điểm kỹ thuật cho Math.

Đối Dalvik (thi hành Android của Java):

Dalvik/vm/InlineNative.c

/* 
* public static double sin(double) 
*/ 
static bool javaLangMath_sin(u4 arg0, u4 arg1, u4 arg2, u4 arg3, 
    JValue* pResult) 
{ 
    Convert64 convert; 
    convert.arg[0] = arg0; 
    convert.arg[1] = arg1; 
    pResult->d = sin(convert.dd); 
    return true; 
} 

Vì vậy, nó gọi libmsin chức năng, mà trên Android được cung cấp bởi bionic libc. Trông giống như

bionic/libm/src/s_sin.c

double 
sin(double x) 
{ 
    double y[2],z=0.0; 
    int32_t n, ix; 

    /* High word of x. */ 
    GET_HIGH_WORD(ix,x); 

    /* |x| ~< pi/4 */ 
    ix &= 0x7fffffff; 
    if(ix <= 0x3fe921fb) { 
     if(ix<0x3e400000)   /* |x| < 2**-27 */ 
      {if((int)x==0) return x;} /* generate inexact */ 
     return __kernel_sin(x,z,0); 
    } 

    /* sin(Inf or NaN) is NaN */ 
    else if (ix>=0x7ff00000) return x-x; 

    /* argument reduction needed */ 
    else { 
     n = __ieee754_rem_pio2(x,y); 
     switch(n&3) { 
     case 0: return __kernel_sin(y[0],y[1],1); 
     case 1: return __kernel_cos(y[0],y[1]); 
     case 2: return -__kernel_sin(y[0],y[1],1); 
     default: 
      return -__kernel_cos(y[0],y[1]); 
     } 
    } 
} 

và thực hiện các __kernel_sin trông giống như

bionic/libm/src/k_sin.c

static const double 
half = 5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */ 
S1 = -1.66666666666666324348e-01, /* 0xBFC55555, 0x55555549 */ 
S2 = 8.33333333332248946124e-03, /* 0x3F811111, 0x1110F8A6 */ 
S3 = -1.98412698298579493134e-04, /* 0xBF2A01A0, 0x19C161D5 */ 
S4 = 2.75573137070700676789e-06, /* 0x3EC71DE3, 0x57B1FE7D */ 
S5 = -2.50507602534068634195e-08, /* 0xBE5AE5E6, 0x8A2B9CEB */ 
S6 = 1.58969099521155010221e-10; /* 0x3DE5D93A, 0x5ACFD57C */ 

double 
__kernel_sin(double x, double y, int iy) 
{ 
    double z,r,v; 

    z = x*x; 
    v = z*x; 
    r = S2+z*(S3+z*(S4+z*(S5+z*S6))); 
    if(iy==0) return x+v*(S1+z*r); 
    else  return x-((z*(half*y-v*r)-y)-v*S1); 
} 

__kernel_cos tương tự.

+0

...? những gì downvote cho? – nneonneo

+0

tôi cũng đã được downvoted. một số thằng ngốc ở đây. – AlexWien

Các vấn đề liên quan