2013-02-20 17 views
11

के लिए मूल कोड मैं सोच रहा था कि क्या कोई तरीका है कि मैं गणित वर्ग के मूल कोड तक पहुंच प्राप्त कर सकता हूं। अधिक विशेष रूप से मुझे पाप() विधि के लिए कोड देखने की आवश्यकता है।जावा गणित वर्ग

+0

क्या आप एक डिकंपेलर चाहते हैं? – EAKAE

+0

नहीं, मैं अपनी खुद की साइन विधि बनाने की तलाश में हूं और मुझे विश्वास है कि गणित वर्ग विधि कैसे काम करेगी। – user2089351

उत्तर

17

यह कार्यान्वयन-निर्भर है। के रूप में java.lang.Math के लिए दस्तावेज़ में कहा गया है:

वर्ग StrictMath के संख्यात्मक तरीकों, वर्ग Math के बराबर सभी कार्यों के कार्यान्वयन के कुछ विपरीत बिट के लिए बिट एक ही परिणाम वापस जाने के लिए परिभाषित नहीं कर रहे हैं। यह छूट बेहतर प्रदर्शन करने वाले कार्यान्वयन की अनुमति देती है जहां सख्त पुनरुत्पादन की आवश्यकता नहीं होती है।

... कोड जनरेटर को Math विधियों के उच्च-प्रदर्शन कार्यान्वयन प्रदान करने के लिए प्लेटफार्म-विशिष्ट देशी पुस्तकालयों या माइक्रोप्रोसेसर निर्देशों का उपयोग करने के लिए प्रोत्साहित किया जाता है। इस तरह के उच्च प्रदर्शन कार्यान्वयन अभी भी Math के विनिर्देश के अनुरूप होना चाहिए।

Dalvik (जावा के एंड्रॉयड कार्यान्वयन) के लिए:

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; 
} 

तो यह libmsin समारोह है, जो एंड्रॉयड पर द्वारा आपूर्ति की है कॉल बायोनिक libc। यही कारण है कि

बायोनिक/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]); 
     } 
    } 
} 

और __kernel_sin के कार्यान्वयन लग रहा है

बायोनिक/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 समान है।

+0

...? के लिए डाउनवोट क्या है? – nneonneo

+0

मुझे भी नीचे गिरा दिया गया था। यहां कुछ मूर्ख हैं। – AlexWien