]> git.mxchange.org Git - simgear.git/commitdiff
Avoid NAN due to floating point rounding errors
authortorsten <torsten>
Fri, 21 Aug 2009 12:10:50 +0000 (12:10 +0000)
committerTim Moore <timoore@redhat.com>
Sun, 23 Aug 2009 19:37:03 +0000 (21:37 +0200)
simgear/math/SGGeodesy.cxx

index e42ce1e3e47946cdc244276a0ea1f72b6892db57..9971829af315ce299bd8ca95abce973de0196069 100644 (file)
@@ -84,6 +84,14 @@ SGGeodesy::SGCartToGeod(const SGVec3<double>& cart, SGGeod& geod)
   double q = Z*Z*(1-e2)*ra2;
   double r = 1/6.0*(p+q-e4);
   double s = e4*p*q/(4*r*r*r);
+/* 
+  s*(2+s) is negative for s = [-2..0]
+  slightly negative values for s due to floating point rounding errors
+  cause nan for sqrt(s*(2+s))
+  We can probably clamp the resulting parable to positive numbers
+*/
+  if( s >= -2.0 && s <= 0.0 )
+    s = 0.0;
   double t = pow(1+s+sqrt(s*(2+s)), 1/3.0);
   double u = r*(1+t+1/t);
   double v = sqrt(u*u+e4*q);