tried my code:
void run(){
BigNumber lon1 = BigNumber("12.563545");
lon1 /= RADS;
BigNumber lon2 = BigNumber("12.561801");
lon2 /= RADS;
BigNumber lat1 = BigNumber("42.857818");
lat1 /= RADS;
BigNumber lat2 = BigNumber("42.858689");
lat2 /= RADS;
BigNumber a,c;
time = micros();
BigNumber sinLat1 = sine(lat1);
// Serial.print("a ");
BigNumber sinLat2 = sine(lat2);
// Serial.print("b ");
BigNumber cosLat1 = cosine(lat1);
// Serial.print("c ");
BigNumber part1a = sinLat1*sinLat2;
// Serial.print("c1 ");
BigNumber part1b = cosLat1*cosine(lat2);
// Serial.print("c2 ");
BigNumber part1c = cosine(lon1-lon2);
// Serial.print("c3 ");
BigNumber part1d = part1a+part1b*part1c;
// Serial.print("c4 ");
a = acos(part1d);
// Serial.print("d ");
BigNumber partD1 = sinLat2 - sinLat1;
// Serial.print("dA:");
printBignum( a );
// Serial.print(" ");
BigNumber partD2 = cosine(a);
// Serial.print("dB ");
BigNumber part1 = partD1 * partD2;
// Serial.print("d1 ");
BigNumber part2 = (cosLat1 * sine(a));
// Serial.print("d2 ");
BigNumber part3 = part1/part2;
// Serial.print("d3 ");
c = acos( part3 );
// Serial.print("e ");
if ( sine(lon2-lon1)>=0 )
c=2*M_PI-c;
time = micros()-time;
cAstro = c;
dAstro = a;
Serial.println ("test2:");
// Serial.print ("distance:");
// Serial.println ((c*RADS));
Serial.print ("distance radians:");
//Serial.println ((c));
printBignum( c );
Serial.print("time:");
Serial.println (time);
}
acosine implementation (very bad precision):
BigNumber acosine(float x) {
BigNumber negate = BigNumber(x < 0);
if (x < 0){
x*=-1;
}
BigNumber ret = -0.0187293;
ret *= x;
ret += 0.0742610;
ret *= x;
ret -= 0.2121144;
ret *= x;
ret += 1.5707288;
BigNumber bigSqrt = x-1;
ret *= bigSqrt.sqrt();
ret -= 2 * negate * ret;
return negate * bigPI + ret;
}
execution time (microseconds, precision of 5): 142256 vs 116(using float)
precison of 10: 474288
ram overflow with precision 20