Microsoft KB Archive/79381

= PRB: Incorrect Results Returned, C Float Functions =

Article ID: 79381

Article Last Modified on 12/1/2003

-

APPLIES TO


 * Microsoft FORTRAN Compiler 4.1
 * Microsoft FORTRAN Compiler 5.0
 * Microsoft FORTRAN Compiler 5.1
 * Microsoft FORTRAN Compiler 4.1
 * Microsoft FORTRAN Compiler 5.0
 * Microsoft FORTRAN Compiler 5.1

-



This article was previously published under Q79381



SYMPTOMS
When using the Microsoft FORTRAN Compiler version 4.1, 5.0, or 5.1, if FORTRAN code attempts to access a C float function, incorrect results may be returned from the C function.



CAUSE
FORTRAN expects a DOUBLE PRECISION number to be returned from both REAL and DOUBLE PRECISION functions. C functions of type float return only 4 bytes, and the FORTRAN run-time incorrectly interprets the value stored in the floating accumulator (__fac) as an 8-byte number.



RESOLUTION
This problem can be avoided by declaring the C function as type double, or by declaring the C function with the _fortran attribute.



Sample Code #1
The following code reproduces the problem:

FORTRAN Code
interface to real function cthing[c](dog) real dog[value] end

real dog real cthing,r dog=2 r=cthing(dog) write(*,*) r      end

C Code

 * 1) include 

float cthing(float dog) {  float cat; printf(&quot;%f \n&quot;,dog); cat=3.0; printf(&quot;%f \n&quot;,cat); return cat; }

Output: Incorrect Results Generated Here
2.000000

3.000000

0.000000E+00

Sample Code #2
The following solution declares the C function with the _fortran attribute, and generates the expected output:

FORTRAN Code
real dog,r real cthing dog=2.0 r=cthing(dog) write(*,*) r      end

C Code

 * 1) include 

float _fortran cthing(float *dog) { float cat; printf(&quot;%f \n&quot;,*dog); cat=3.0; printf(&quot;%f \n&quot;,cat); return cat; }

Output
2.000000

3.000000

3.000000

Additional query words: 5.00 5.10 mixed nofps language

Keywords: KB79381

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.