charly,
Je suis programmeur Java moi aussi, mais pas sur mobile.
Je précise un peu ma pensée. J'avais carrément en tête quelque chose d'aussi brutal et codé en dur que (en SE) :
Citation :
public class Test {
public static final double[] ARCCOS = new double[] {
1.570796327,
1.56079616, 1.550794993, 1.540791825, 1.530785652, 1.52077547, 1.510760268, 1.500739034, 1.490710747, 1.480674382, 1.470628906,
1.460573277, 1.450506444, 1.440427347, 1.430334912, 1.420228054, 1.410105674, 1.399966658, 1.389809876, 1.37963418, 1.369438406,
1.359221367, 1.348981856, 1.338718644, 1.328430476, 1.318116072, 1.307774124, 1.297403295, 1.287002218, 1.276569489, 1.266103673,
1.255603294, 1.24506684, 1.234492752, 1.223879429, 1.213225223, 1.202528433, 1.191787306, 1.18100003, 1.170164734, 1.159279481,
1.148342265, 1.137351007, 1.12630355, 1.115197653, 1.104030988, 1.092801128, 1.081505549, 1.070141614, 1.058706574, 1.047197551,
1.035611537, 1.023945376, 1.012195761, 1.000359217, 0.988432089, 0.976410527, 0.964290472, 0.952067636, 0.939737486, 0.927295218,
0.914735736, 0.902053624, 0.889243115, 0.876298061, 0.86321189, 0.849977566, 0.836587539, 0.823033692, 0.809307274, 0.79539883,
0.781298117, 0.766994008, 0.752474376, 0.737725968, 0.722734248, 0.707483212, 0.691955175, 0.67613051, 0.659987329, 0.643501109,
0.626644212, 0.609385308, 0.591688642, 0.573513104, 0.554811033, 0.535526654, 0.515594006, 0.494934126, 0.473451157, 0.451026812,
0.427512265, 0.402715842, 0.376383482, 0.348166021, 0.317560429, 0.283794109, 0.245565518, 0.200334842, 0.141539473, 0
};
public static double arccos(double value) {
// vérifier que bien compris entre -1 et +1
if (value<0) return Math.PI-arccos(-value);
if (value==1) return 0;
int i1 = (int) Math.floor(100*value);
int i2 = i1+1;
return ARCCOS[i1]+(100*value-i1)/(i2-i1)*(ARCCOS[i2]-ARCCOS[i1]);
}
public static void demo(double value) {
System.out.println("Pour arcos("+value+"), cette méthode donne "
+arccos(value)+" alors que la valeur \"exacte\" est "+Math.acos(value));
}
public static void main(String[] args){
demo(-1);
demo(-0.345);
demo(0);
demo(0.567);
demo(1);
}
}
qui donne :
Citation :
Pour arcos(-1.0), cette méthode donne 3.141592653589793 alors que la valeur "exacte" est 3.141592653589793
Pour arcos(-0.345), cette méthode donne 1.9230403275897932 alors que la valeur "exacte" est 1.9230351118919613
Pour arcos(0.0), cette méthode donne 1.570796327 alors que la valeur "exacte" est 1.5707963267948966
Pour arcos(0.567), cette méthode donne 0.9679264885 alors que la valeur "exacte" est 0.9679370804057764
Pour arcos(1.0), cette méthode donne 0.0 alors que la valeur "exacte" est 0.0
La précision est très bonne. Donc on peut se contenter d'un tableau plus petit.
Mais ce genre de solutions ne convient peut-être pas pour un mobile.
Bon développement,
Nicolas