KI%MIT-OZ@MIT-MC.ARPA (06/21/84)
I am currently using Berkeley Unix 4.2 running on VAX 11/750. I would like to change the C compiler so that the floating point arithmetic is not carried out in double-precision. If anybody has ever done this or knows how to do it easily, would you please send me some information regarding this problem? Thank you. - Ki@MIT-OZ -------
gam@amdahl.UUCP (Gordon A. Moffett) (11/15/84)
> From: Mike Newton <newton@cit-vax.ARPA> > > One warning in regards to the Amdahl (UTS) C compiler: variables > defined like: > > float (*f)[3]; (the parenthesis around the *f are IMPORTANT > and probably ignored by the compiler!). > > will NOT work correctly. For example in the following program: > > char *c; > float (*f)[3]; > main() { > f = (float (*)[3]) c; > } > > which should cause a direct copy from c to f instead causes a derfernce. > > They have been notified, and agree that there is a problem. Hopefully > a fix will come soon! [ the following is part of a letter sent to Mike, included here for general edification. The author is John Marshall (amdahl!jlm) ] ...[T]he program you reference: char *c; float (*f)[3]; main() { f = (float(*)[3]) c; } generates the correct code of assigning the value of c to f. So your statement that the compiler ignored the * in parenthesis and that c was dereferenced is not correct. The (float(*)[3]) is merely a cast and doesn't affect code generation at all. Of course the value received by f is zero since c was never assigned a value. There is, however, a problem in the UTS compiler with a pointer to an array declared as (*f)[]: when it is used as an rvalue, it has one too many indirections. [ Your original program ], I believe, included a reference to (*f)[n], which caused an addressability error on UTS. This was the statement that generated erroneous code, and the reason for the bug was that the compiler generated code as if f had been declared as float **f. The problem indeed has been fixed. I am curious though as to why f was declared in this way rather than as float *f; It generates the same storage allocation and references as your declaration. Remember that float (*f)[3]; does NOT allocate space for an array! It allocates space for a pointer to a float just as float *f; does. The following are equivalent: float (*f)[3]; float x; char *c; f = (float (*)[3]) c; x = (*f)[2]; float *f; float x; char *c; f = (float *) c; x = f[2]; -- John Marshall amdahl!jlm -- Gordon A. Moffett ...!{ihnp4,hplabs,amd,nsc}!amdahl!gam 37 22'50" N / 122 59'12" W [ This is just me talking. ]