Beware: MS FORTRAN Powerstation 1.0

1 messages 1 people Latest: Oct 14, 1996

Beware: MS FORTRAN Powerstation 1.0

From: Paul Laub Date: October 14, 1996 technical
From plaub@draco.rm.fccc.edu Mon Oct 14 06:13:51 1996 Subject: Beware: MS FORTRAN Powerstation 1.0 Hello NONMEM users, This message is relevant to anyone writing/compiling/linking FORTRAN code using the 32-bit Microsoft FORTRAN Powerstation 1.0 compiler (fl32). Many users - like myself - run NONMEM, ADAPT II, and other FORTRAN programs on the PC using this compiler. If you are using NONMEM and writing control files, then you might be interested in this message. Be very wary of the /Ox "optimization" command line option for fl32. From the problems I have had (illustrated below), I suggest either not using it all or, if you must, using the /Op "improved floating point consistency" option as well. Currently, control files are compiled with the /Ox /Op options. To illustrate the problems with /Ox, consider dsin(t**q), where both t and q are real-valued. By definition of the sine function, dsin() should return a number between -1 and 1. What one actually gets depends on whether /Ox alone is used (ie., wrong answer) or whether /Ox /Op or neither are used (ie., correct answer). The simple test file below illustrates this. After I posted this question to comp.lang.fortran newsgroup, one reader responded that the assembly language output of fl32 showed that /Ox was optimizing dsin(t**q) to t*dsin(q). How nice. (Another newsgroup respondent noted that the bug is apparently fixed in the now current Powerstation version 4.0 for Windows 95.) Paul Laub c.. This program demonstrates how floating point optimization can changing c.. correct output into wildly wrong output. Compile this source code three c.. different ways and run each: c.. c.. fl32 test.for c.. fl32 /Ox test.for c.. fl32 /Ox /Op test.for c.. c.. These results were obtained using MS FORTRAN Powerstation 1.0 c.. c.. Paul B. Laub 9 Oct 96 program test integer i real*8 q,t q = 2.0D0 do i = 1,10 t = dble(i) write(*,'(1X,A,I6,A,F12.6)') & `For t = `, i, ` dsin(t**2) = `, dsin(t**q) enddo end c.. Here is the correct output, which is generated when test.for is c.. compiled and linked with the command of c.. fl32 test.for c.. c.. For t = 1 dsin(t**2) = .841471 c.. For t = 2 dsin(t**2) = -.756802 c.. For t = 3 dsin(t**2) = .412118 c.. For t = 4 dsin(t**2) = -.287903 c.. For t = 5 dsin(t**2) = -.132352 c.. For t = 6 dsin(t**2) = -.991779 c.. For t = 7 dsin(t**2) = -.953753 c.. For t = 8 dsin(t**2) = .920026 c.. For t = 9 dsin(t**2) = -.629888 c.. For t = 10 dsin(t**2) = -.506366 c.. c.. Here is the INCORRECT (and obviously absurd output considering that the c.. real valued sine function is bound by -1 and 1. This output was c.. generated by compiling with the command of c.. fl32 /Ox test.for c.. c.. Note the use of the /Ox optimization c.. c.. c.. For t = 1 dsin(t**2) = 1.000000 c.. For t = 2 dsin(t**2) = 1.878131 c.. For t = 3 dsin(t**2) = 2.715471 c.. For t = 4 dsin(t**2) = 3.527375 c.. For t = 5 dsin(t**2) = 4.320874 c.. For t = 6 dsin(t**2) = 5.100009 c.. For t = 7 dsin(t**2) = 5.867397 c.. For t = 8 dsin(t**2) = 6.624871 c.. For t = 9 dsin(t**2) = 7.373781 c.. For t = 10 dsin(t**2) = 8.115166 c.. c.. Here is the output for the executable created with by c.. fl32 /Ox /Op test.for c.. c.. The /Op option "improves floating point consistency"; it is designed c.. to be used with the /Ox option (which by itself may overoptimize). See c.. MS Powerstation 1.0 manuals for more discussion. c.. c.. For t = 1 dsin(t**2) = .841471 c.. For t = 2 dsin(t**2) = -.756802 c.. For t = 3 dsin(t**2) = .412118 c.. For t = 4 dsin(t**2) = -.287903 c.. For t = 5 dsin(t**2) = -.132352 c.. For t = 6 dsin(t**2) = -.991779 c.. For t = 7 dsin(t**2) = -.953753 c.. For t = 8 dsin(t**2) = .920026 c.. For t = 9 dsin(t**2) = -.629888 c.. For t = 10 dsin(t**2) = -.506366 Paul (Sisyphus) B. Laub Dept. of Medical Oncology 328 West Bldg. Fox Chase Cancer Center 7701 Burholme Ave. Phila. PA 19111 USA p_laub@fccc.edu (215)728-4743 (voice) (215) 728-2741 (fax)