Mail Archives: djgpp/1996/05/19/10:22:05
To any of those friendly DJGPP gurus this may be of a concern:
On Wed, 15 May 1996 I submitted a Q to <djgpp AT delorie DOT com> regarding 
SIGFPE's I get with V2.x and lengthy algebraic exprs. compiled using 
the -On switch. As is obvious from the the code attached below (following 
'======' ) using DJGPP-V2.x and the -On switch things are even much worse. 
Setting:
	#define PRIFCT printf
	//	#define PRIFCT //
in this small program, which just evals. a few simple expressions, and
compiling with:	
	gcc -O foo.cc -lm
everything seems to be ok. with the program producing some completely
harmless output:
	z111=  -1.625e+00
	z112=   3.188e+00
	z11=  -2.750e-01
	z12=   4.875e+00
	z13=   1.000e+00
	z1=  -3.644e+03
	z21=  -6.250e-02
	z22=   2.625e+00
	z2=  -1.433e+02
	z3=  -8.206e+01
	z4=  -4.573e+04
	z5=   2.039e+01
	z6=   3.221e+00
	z7=   2.243e-01
	z8=   3.221e+00
	z9=   4.624e+01
	F=  -5.701e+00
However, simply commenting away the various printf statements by setting:
	//	#define PRIFCT printf
	#define PRIFCT //
and, again, compiling with:
	gcc -O foo.cc -lm
the program crashes with:
Exiting due to signal SIGFPE
Floating Point exception at eip=000016be
eax=3ff00000 ebx=00000000 ecx=0005304c edx=3fe00000 esi=3fe00000 edi=0000dac0
ebp=0004da98 esp=0004da40 cs=00a7 ds=00af es=00af fs=008f gs=00bf ss=00af
Call frame traceback EIPs:
  0x000016be   _main+286
  0x00003dd3   ___crt1_startup+115
Now, doing all the same as above however, with the -On switch *removed*,
i.e. gcc foo.cc -lm, there is *no* problem with *both* versions of the
program.
WHAT IS WRONG HERE !?!?
B.t.w.:
1) I performed the whole procedure with * V1.x * : No problems.
2) I did all of it on a SUN workstation using SOLARIS'  CC compiler: 
   No problems.
3) Like suggested by one of the answers to my previous mail I enabled the
   strength-reduce opt. in the lib specs: still the same problem with V2.x
4) The time stamps of those distribution file I use in my setup and do the
   compilation with is:
		SPECS              693 24.12.95    3:47
		CPP      EXE    115712 22.02.96    3:49
		CC1PLUS  EXE   1360896 05.02.96    2:10
		AS       EXE    247296 05.02.96    2:08
		LD       EXE    230400 05.02.96    2:09
		STUBIFY  EXE     53760 31.01.96    5:41
5) My machine is just a one of those simple garden-variety 486-PCs,
   16MB Ram, and the usual stuff ....
Any help is most appreciated. I am *not* subscribing to the djgpp mailing
list so please mail your comments to: brenig AT thp DOT uni-koeln DOT de
Thanks :-) !
==================Here is that program=======================
#include <stdio.h>
#include <math.h>
#define QDR(x) ((x)*(x))
#define CUB(x) ((x)*(x)*(x))
#define PRIFCT printf
//#define PRIFCT //
int main() {
	double	t=5.,d0=1.,a=2.,b=1.,c=-.6,be=.5,ga=2,nu=.66,T=.5;
	double	tm1=T-1,emt=1-T,th2=QDR(T);
	double	th4=QDR(th2),tm1h2=QDR(tm1),atm1h2=QDR(a*tm1);
	double	pa=pow(emt,ga),pe=pow(T,be),ex=exp(a/T);
	double	F,z111=0,z112=0,z11=0,z12=0,z13=0,z1=0,z21=0,z22=0,z2=0,z3=0,
					z4=0,z5=0,z6=0,z7=0,z8=0,z9=0;
	z111=(a*tm1-T*(be*tm1+ga*T+emt));
	PRIFCT("z111=%12.3e\n",z111);
	z112=(atm1h2-a*T*tm1*(be*tm1+3*ga*T-2*tm1)+ga*CUB(T)*
		(be*tm1+T*(2*ga-1)));
	PRIFCT("z112=%12.3e\n",z112);
	z11=(b*c*z112*pa+be*T*tm1*z111);
	PRIFCT("z11=%12.3e\n",z11);
	z12=(2*atm1h2-2*a*T*tm1*(2*ga*T+emt)+ga*th4*(2*ga-1));
	PRIFCT("z12=%12.3e\n",z12);
	z13=(2*be*tm1+ga*T+emt);
	PRIFCT("z13=%12.3e\n",z13);
	z1=(be*c*th2*tm1*z13*pow(T,2*be)+ex*z11*pe-b*z12*QDR(ex)*pa);
	PRIFCT("z1=%12.3e\n",z1);
	z21=(QDR(be*tm1)+be*tm1*(2*ga*T+emt)+ga*th2*(ga-1));
	PRIFCT("z21=%12.3e\n",z21);
	z22=(atm1h2-2*a*T*tm1*(ga*T+emt)+ga*th4*(ga-1));
	PRIFCT("z22=%12.3e\n",z22);
	z2=(c*th2*z21*pe-z22*ex);
	PRIFCT("z2=%12.3e\n",z2);
	z3=(c*T*(be*tm1+ga*T)*pe+(a*tm1-ga*th2)*ex);
	PRIFCT("z3=%12.3e\n",z3);
	z4=2*(c*pe-ex)*QDR(be*T*tm1*pe-b*(a*tm1-ga*th2)*ex*pa);
	PRIFCT("z4=%12.3e\n",z4);
	z5=(be*T*tm1*pe-b*(a*tm1-ga*th2)*ex*pa);
	PRIFCT("z5=%12.3e\n",z5);
	z6=(th4*QDR(pe+b*ex*pa)*tm1h2);
	PRIFCT("z6=%12.3e\n",z6);
	z7=(th4*(pe+b*ex*pa)*tm1h2);
	PRIFCT("z7=%12.3e\n",z7);
	z8=(th4*QDR(pe+b*ex*pa)*tm1h2);
	PRIFCT("z8=%12.3e\n",z8);
	z9=(th4*CUB(pe+b*ex*pa)*tm1h2);
	PRIFCT("z9=%12.3e\n",z9);
	F=b*pa*(z1/z6-z2/z7+z5*z3/z8-z4/z9);
	printf("F=%12.3e\n",F);
	return 1;
}
- Raw text -