From: rohde AT prairienet DOT org (Scott Rohde) Subject: Linking in the math library produces peculiar results. Newsgroups: comp.os.msdos.djgpp Organization: Prairienet Lines: 82 X-Newsreader: TIN [UNIX 1.3 950824BETA PL0] Message-ID: <_3K63.2422$xg.109@firefly> Date: Mon, 07 Jun 1999 06:58:02 GMT NNTP-Posting-Host: 192.17.3.4 X-Complaints-To: newsmgr AT prairienet DOT org X-Trace: firefly 928738682 192.17.3.4 (Mon, 07 Jun 1999 01:58:02 CDT) NNTP-Posting-Date: Mon, 07 Jun 1999 01:58:02 CDT To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com The following test program, which uses the sine function, works as expected when compiled without the -lm option (I assume that means it is using a definition for sin(double) in libc.a). But with -lm, I get very peculiar results: for the integral (but not int!) values of x between x = 29.0 and x = 75.0, the value returned by the sine function for one of the four angles having x for a reference angle is off in all but eleven cases. As far as I can tell, the other three of the values always correspond (and seem to be correct, though I haven't gone through and checked each one against a trig table), but the errant value is usually not even in the ballpark. For example, if the results of my test program are to be believed, |sin(30)| = |sin(150)| = |sin(330)| = 0.5 but |sin(210)| = 0.362922 I get similar results from tan and cos (with appropriate changes of signs). I tried compiling with the -D_USE_LIBM_MATH_H, but that doesn't seem to work either. Also, I tried using the graphics library to plot several cycles of the sine function--the spurious results seem to be confined to the interval (-2pi, +2pi). BTW, I am using a 486sx cpu--i.e., no math co-processor. Whether or not I link in floating point emulation with the -lemu switch makes no difference in the program results. But as I said before, the results seem fine when I compile without the -lm switch, so I wouldn't think this would be a hardware or floating-point emulation problem. Any clues as to what is going on here? Here's the program I used: #include #include #include #include _LIB_VERSION_TYPE _LIB_VERSION = _POSIX_; // included as an after-thought // per documentation instructions--didn't help int bigdiff(double a, double b) { double diff = a - b; return (diff > 0.01 || diff < -0.01); } double toRadians(double angle) { return angle * M_PI / 180.0; } int main() { // included as an after-thought per documentation // instructions ust in case it might help--it didn't: _clear87 (); _fpreset (); cout << "starting program" << endl; for (double x = 0.0; x <= 90.01; x += 1.0) { if ( bigdiff(sin(toRadians(x)), sin(toRadians(180 - x))) || bigdiff(sin(toRadians(x)), -sin(toRadians(180 + x))) || bigdiff(sin(toRadians(x)), -sin(toRadians(360 - x))) ) { cout << setw(3) << x << setw(15) << sin(toRadians(x)) << setw(15) << sin(toRadians(180 - x)) << setw(15) << sin(toRadians(180 + x)) << setw(15) << sin(toRadians(360 - x)) << endl; } } cout << "ending program" << endl; }