Clearing the Coprocessor Status Word from FORTRANLast reviewed: July 31, 1997Article ID: Q35434 |
4.00 4.01 4.10 5.00 5.10 1.00 1.00a | 4.10 5.00 5.10 | 1.00 4.00
MS-DOS | OS/2 | WINDOWS NTkbprg kbcode The information in this article applies to:
SUMMARYPage 17 of the Microsoft FORTRAN "Advanced Topics" manual for version 5.1 includes the following statement:
When one of the floating-point exception conditions given in Table 1.2 above occurs, the appropriate bit in the status word is set. This flag remains set until you clear it.While the GETSTATUSFPQQ and SSWRQQ subroutines returns the value of the status word, there is no FORTRAN function or subroutine that will modify the status word.
MORE INFORMATIONUnder normal circumstances, when the math coprocessor generates a floating-point exception, an exception handler is called which can clear the status word. If it is necessary to reset the control word at another time, the FORTRAN run-time library provides the C functions _clear87 and _fpreset which an application can access using an INTERFACE statement. The _clear87 function returns the value of the status word before changing the status word; the _fpreset subroutine resets the status word and returns no value. The _clear87 and _fpreset functions might be useful when an application spawns another application that might perform a floating- point operation. When the spawned application completes execution, call the _clear87 or _fpreset function to return the floating-point environment to its default state. The following code example demonstrates using the _clear87 and _fpreset functions from FORTRAN. NOTE: The sample code below will not link using FORTRAN's 32-bit linker due to a change in libc.lib. It no longer contains the function __clear87. Under the 32-bit FORTRAN compilers, the C function __clear87 is replaced by __clearfp.
Sample CodeC Compiler options required: None
INTERFACE TO SUBROUTINE FPRESET[C, ALIAS:'__FPRESET'] END INTERFACE TO INTEGER*2 FUNCTION CLEAR87[C, ALIAS:'__CLEAR87'] END INTEGER*2 CLEAR87 PRINT '(1X, A, Z)', 'INITIAL STATUS WORD: ', CLEAR87() X = 1.E-38 X = X / 100. PRINT '(1X, A, Z)', 'STATUS WORD AFTER UNDERFLOW: ', CLEAR87() CALL FPRESET PRINT '(1X, A, Z)', 'STATUS WORD AFTER _FPRESET: ', CLEAR87() END |
Additional reference words: 1.00 4.00 4.01 4.10 5.00 5.10 8087 80287 80387
© 1998 Microsoft Corporation. All rights reserved. Terms of Use. |