Mail Archives: djgpp/1999/06/07/15:50:26
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

XNewsreader:  TIN [UNIX 1.3 950824BETA PL0]

MessageID:  <_3K63.2422$xg.109@firefly>

Date:  Mon, 07 Jun 1999 06:58:02 GMT

NNTPPostingHost:  192.17.3.4

XComplaintsTo:  newsmgr AT prairienet DOT org

XTrace:  firefly 928738682 192.17.3.4 (Mon, 07 Jun 1999 01:58:02 CDT)

NNTPPostingDate:  Mon, 07 Jun 1999 01:58:02 CDT

To:  djgpp AT delorie DOT com

DJGateway:  from newsgroup comp.os.msdos.djgpp

ReplyTo:  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 functionthe spurious results seem
to be confined to the interval (2pi, +2pi).
BTW, I am using a 486sx cpui.e., no math coprocessor. 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 floatingpoint emulation problem. Any
clues as to what is going on here?
Here's the program I used:
#include <math.h>
#include <iostream.h>
#include <iomanip.h>
#include <float.h>
_LIB_VERSION_TYPE _LIB_VERSION = _POSIX_; // included as an afterthought
// per documentation instructionsdidn'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 afterthought per documentation
// instructions ust in case it might helpit 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;
}
 Raw text 