Microsoft KB Archive/102692: Difference between revisions
(importing KB archive) |
m (Text replacement - """ to """) |
||
Line 69: | Line 69: | ||
Microsoft has confirmed this to be a problem in PowerStation versions 1.0 and 1.0a for MS-DOS. This problem has been resolved with FORTRAN PowerStation maintenance release version 1.0a for MS-DOS.<br /> | Microsoft has confirmed this to be a problem in PowerStation versions 1.0 and 1.0a for MS-DOS. This problem has been resolved with FORTRAN PowerStation maintenance release version 1.0a for MS-DOS.<br /> | ||
<br /> | <br /> | ||
FORTRAN Powerstation version 1.0 can be differentiated from the maintenance release version 1.0a by invoking the linker. Typing | FORTRAN Powerstation version 1.0 can be differentiated from the maintenance release version 1.0a by invoking the linker. Typing "link32 | more" from the \f32\BIN directory will show version 2.8 for FORTRAN Powerstation version 1.0, and it will show 1.0f for the maintenance release version 1.0a. | ||
</div> | </div> | ||
Line 87: | Line 87: | ||
This statement causes the MS-DOS extender to ignore the math coprocessor and use the emulator code for all math operations.<br /> | This statement causes the MS-DOS extender to ignore the math coprocessor and use the emulator code for all math operations.<br /> | ||
<br /> | <br /> | ||
The following code example prints the word | The following code example prints the word "Failed" when it runs with the floating-point emulator:<br /> | ||
=== Sample Code 1 === | === Sample Code 1 === | ||
Line 104: | Line 104: | ||
</pre> | </pre> | ||
<br /> | <br /> | ||
The following code example demonstrates using the NINT intrinsic function to avoid this error. This code prints the word | The following code example demonstrates using the NINT intrinsic function to avoid this error. This code prints the word "OK" even when a math coprocessor is not available.<br /> | ||
=== Sample Code 2 === | === Sample Code 2 === |
Latest revision as of 09:37, 20 July 2020
PSS ID Number: 102692
Article Last Modified on 11/2/2001
The information in this article applies to:
- Microsoft FORTRAN PowerStation for MS-DOS
This article was previously published under Q102692
SYMPTOMS
When an application developed in Microsoft FORTRAN PowerStation runs on a computer that does not have a math coprocessor installed, the code may convert a REAL variable or expression to an INTEGER variable incorrectly, resulting in incorrect results.
CAUSE
When an application immediately converts the results of a REAL calculation to an INTEGER value, the code does not remove the results from the coprocessor emulator stack. The numeric conversion routine __ftol (float to long) uses this extended coprocessor-stack-based value instead of the truncated contents stored in the variable. The __ftol function incorrectly rounds down the extended-precision result.
RESOLUTION
To work around this problem, use the NINT (round to nearest integer) intrinsic function to explicitly convert the expression or variable to an INTEGER.
The /Ox optimization compiler option switch may resolve this error. Among other optimizations, the /Ox switch calculates constant expressions at compile time. These calculations may correctly convert the REAL number to an INTEGER while the run-time calculation produces the incorrectly rounded result.
STATUS
Microsoft has confirmed this to be a problem in PowerStation versions 1.0 and 1.0a for MS-DOS. This problem has been resolved with FORTRAN PowerStation maintenance release version 1.0a for MS-DOS.
FORTRAN Powerstation version 1.0 can be differentiated from the maintenance release version 1.0a by invoking the linker. Typing "link32 | more" from the \f32\BIN directory will show version 2.8 for FORTRAN Powerstation version 1.0, and it will show 1.0f for the maintenance release version 1.0a.
MORE INFORMATION
The FORTRAN PowerStation floating-point emulator is a virtual dynamic- link library (DLL) in the Phar Lap MS-DOS extender. To duplicate this problem on a computer with a math coprocessor installed, type the following at the MS-DOS command prompt:
SET TNT=-FPEM
This statement causes the MS-DOS extender to ignore the math coprocessor and use the emulator code for all math operations.
The following code example prints the word "Failed" when it runs with the floating-point emulator:
Sample Code 1
C Compiler options needed: none
x = 3.0 z = -3. ** x i = z if (i .ne. -27) then print *, 'Failed' else print *, 'OK' end if end
The following code example demonstrates using the NINT intrinsic function to avoid this error. This code prints the word "OK" even when a math coprocessor is not available.
Sample Code 2
C Compiler options needed: none
x = 3.0 z = -3. ** x i = nint(z) if (i .ne. -27) then print *, 'Failed' else print *, 'OK' end if end
Additional query words: 1.00 Phar Lap DOSXMSF.EXE
Keywords: kbbug KB102692
Technology: kbAudDeveloper kbFortranSearch kbZNotKeyword3