On Wed, 2009-04-22 at 19:57 -0400, Patrice Poly wrote: > Le Wednesday 22 April 2009 19:20:54 Martin Spott, vous avez écrit : > > Curtis Olson wrote: > > > I'm seeing a ton of these nan's when I start at KHAF ... it's just one or > > > two or three per frame, but that ends up spewing an awful lot of extra > > > text to my console. > > > > That's weird, at least using the ASK 21 I don't see a single one - on > > Linux/AMD64 with GCC-4.3.2, > > > > Martin. > > Here on OpenSuse 11.0, 64 bits , core2quad, and GCC 4.3.1, I don't have a > single one, with any plane, anywhere.
I don't have nans here, either. Debian stable, GCC 4.2.3 (Debian 4.2.3-5). Only tried a couple of airplanes (c172p and DA20) and a couple of airports (KHAF, KHIF) > I suspect the Nans to have the following probable origins: > > **get_elevation_m doesn't hit the ground at all, ( but then its said to > return > the sea level ) > > **a division by zero occurs somewhere here: The calls to asin() look pretty scary to me. Could we move all the math outside the call and make sure the math never adds up to more than +/-1? asin returns NaN if the input isn't in the valid range for a sine. We could also check for a NaN out of the asin calls and do something creative if it returns NaN... > for (int i = 0; i <= 4; i++) > { > probe_lat_rad[i] = > asin(sin(deg2rad*user_latitude_deg)*cos(dist_probe_m[i]/earth_rad_m) > +cos(deg2rad*user_latitude_deg)*sin(dist_probe_m[i]/earth_rad_m)*cos(ground_wind_from_rad)); The formula above, I believe, is theoretically capable of only reaching +/- 1.0. So it is probably safe. > if (probe_lat_rad[i] == 0.0) { > probe_lon_rad[i] = (deg2rad*user_latitude_deg); // > probe on a pole > } > else { > probe_lon_rad[i] = > fmod((deg2rad*user_longitude_deg+asin(sin(ground_wind_from_rad) > > *sin(dist_probe_m[i]/earth_rad_m)/cos(probe_lon_rad[i]))+PI) > ,(2.0*PI))-PI; Anytime sin(ground_wind_from_rad)*sin(dist_probe_m[i]/earth_rad_m) is greater than cos(probe_lon_rad[i]) the line above will return a NaN. Can this condition happen? > } > probe_lat_deg[i]= rad2deg*probe_lat_rad[i]; > probe_lon_deg[i]= rad2deg*probe_lon_rad[i]; > } > > but I thought checking for poles would prevent this ? > > ** divisions by zero here ? > > slope[0] = (probe_elev_m[0] - probe_elev_m[1]) / dist_probe_m[1]; > slope[1] = (probe_elev_m[1] - probe_elev_m[2]) / dist_probe_m[2]; > slope[2] = (probe_elev_m[2] - probe_elev_m[3]) / dist_probe_m[3]; > slope[3] = (probe_elev_m[4] - probe_elev_m[0]) / -dist_probe_m[4]; > > unlikely, as these are initialized with good, positive values > > ** division by zero again ? > > else > { > agl_factor = exp(-(2 + 2 * probe_elev_m[0] / 4000) * > (user_altitude_agl_m - BOUNDARY2_m) / > max(probe_elev_m[0],200.0)); > } > > I'm a bit at lost for now, as I really don't see any NaN anymore here, and > don't have another platform to test on. > > I would be interested to see on which platforms / configuration this happens, > maybe when more feedback comes in ?? ------------------------------------------------------------------------------ Stay on top of everything new and different, both inside and around Java (TM) technology - register by April 22, and save $200 on the JavaOne (SM) conference, June 2-5, 2009, San Francisco. 300 plus technical and hands-on sessions. Register today. Use priority code J9JMT32. http://p.sf.net/sfu/p _______________________________________________ Flightgear-devel mailing list Flightgear-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/flightgear-devel