Mi chiedevo se c'è un modo per ottenere l'accesso al codice nativo per la classe Math. Più specificamente ho bisogno di vedere il codice per il metodo sin().codice nativo per Java Math classe
risposta
Questo dipende dall'implementazione. Come indicato nella documentazione per java.lang.Math
:
A differenza dei metodi numerici di classe
StrictMath
, tutte le implementazioni delle funzioni equivalenti della classeMath
non sono definiti per restituire gli stessi risultati bit per bit. Questo rilassamento consente implementazioni più performanti laddove non è richiesta una rigida riproducibilità.... I generatori di codice sono invitati a utilizzare librerie native specifiche della piattaforma o istruzioni del microprocessore, ove disponibili, per fornire implementazioni a prestazioni più elevate dei metodi
Math
. Tali implementazioni ad alte prestazioni devono ancora essere conformi alle specifiche perMath
.
Per Dalvik (Android implementazione di 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;
}
Così chiama la funzione libm
sin
, che su Android viene fornita dallo libica bionica. Che assomiglia
bionico/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]);
}
}
}
e l'implementazione di __kernel_sin
assomiglia
bionico/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
è simile.
- 1. Compilando java nel codice nativo?
- 2. accesso java metodo sincronizzato dal codice nativo
- 3. perdita di memoria java con codice nativo
- 4. Limita funzionalità codice nativo da Java
- 5. Posso compilare Java nel codice nativo?
- 6. codice sorgente del metodo nativo Java
- 7. Chiama codice Java non nativo da Python
- 8. Java stringa di codice nativo fine
- 9. Access AsyncStorage dal codice nativo
- 10. visualizza codice nativo da Eclipse
- 11. Java Math (s) API di analisi
- 12. Come utilizzare Java Math Commons CurveFitter?
- 13. Estensione per Firefox: esecuzione del codice nativo?
- 14. Strumentazione del codice a byte - implementa l'agente nativo o java?
- 15. classe generatore nativo in ibernazione
- 16. Differenza tra codice nativo e codice gestito?
- 17. implementazione classe o importazione classe java
- 18. Three.js portato su codice nativo?
- 19. Codice misto (nativo, gestito): come interagisce (tecnicamente)?
- 20. Caricamento FMOD puramente da codice nativo
- 21. Dinamica -ffast-math
- 22. Math Behind MKMetersPerMapPointAtLatitude
- 23. La compilazione del codice nativo per Android Studio è lenta
- 24. Computer grafica: Math to Code
- 25. Perché i metodi della classe Math sono statici?
- 26. Creare il metodo java nativo per il costruttore
- 27. Debug di codice nativo di HelloJni
- 28. Qual è il modo più veloce per accedere al codice nativo da Java?
- 29. Libreria per virgola mobile in virgola mobile Math in .NET
- 30. JSON per classe Java
Vuoi un decompilatore? – EAKAE
No, sto cercando di creare il mio metodo sinusoidale e credo che sapere come funziona il metodo di classe Math potrebbe essere d'aiuto. – user2089351