Some equations using exponents on Windows XP Professional 64-bit evaluate
incorrectly, but can be computed correctly by splitting up the equation into
multiple statements.

I apologize in advance if this turns out to be just a MinGW bug, but thought
I'd start with gcc first.

I am using MinGW GFortran with the following built-in specs.
Target: x86_64-pc-mingw32
Configured with: ../gcc/configure --target=x86_64-pc-mingw32
--prefix=/c/buildbot/vista64-mingw32/mingw-x86/build/root
--with-sysroot=/c/buildbot/vista64-mingw32/mingw-x86/build/root
--disable-multilib --enable-languages=all,obj-c++
Thread model: win32
gcc version 4.4.0 20090110 (experimental) (GCC)


Here is some sample code that demonstrates the problem:
myfunc.f
------------------------------------------------------------
      Subroutine myfunc(a,b,c,d,e,res1,res2)

      Real a,b,c,d,e
      Parameter (g = 273.15)


      res1 = a*(b/a)**((c-d-g)/(e-d))

      res2 = (b/a)**((c-d-g)/(e-d))
      res2 = res2 * a

      Return
      End


      Subroutine myfunc2(a,b,c,d,res1,res2)

      Real a,b,c,d,res1,res2

      res1 = a*(b/c)**d
      res2 = (b/c)**d
      res2 = a * res2

      Return
      End

      Subroutine myfunc3(a,b,c,d,e,f,g,h,i,res1,res2)

      Real a,b,c,d,e,f,g,h,i,res1,res2

      res1 = a*((b/(b+c*(d-e)))**((f*g)/(h*i)))*100.
      res2 = ((b/(b+c*(d-e)))**((f*g)/(h*i)))*100.
      res2 = a*res2

      Return
      End




main.c
------------------------------------------------------

#include <stdio.h>


extern void myfunc(float *a, float *b, float *c, float *d, float *e, float
*res1, float *res2); 
extern void myfunc2(float *a, float *b, float *c, float *d, float *res1, float
*res2); 
extern void myfunc3(float *a, float *b, float *c, float *d, float *e, float *f,
float *g, float *h, float *i, float *res1, float *res2); 

int main( int argc, char *argv[] )
{
    float a,b,c,d,e,f,g,h,i,res1,res2;

    a=1000.0;
    b=850.0;
    c=143.204;
    d=30.5280;
    e=8.2351;
    res1 = 0;
    res2 = 0;

    myfunc(&a,&b,&c,&d,&e,&res1,&res2);

    printf("Function 1:\n--------------------\nresult 1: %f\nresult 2:
%f\n\n",res1,res2);


    a=103780.0;
    b=253.13005;
    c=231.676270;
    d=-16.904803;

    myfunc2(&a,&b,&c,&d,&res1,&res2);

    printf("Function 2:\n--------------------\nresult 1: %f\nresult 2:
%f\n\n",res1,res2);


    a=1513.25;
    b=238.149994;
    c=-16.500040;
    d=3.2;
    e=0;
    f=9.806650;
    g=20.964399;
    h=7614.320313;
    i=-0.1065;

    myfunc3(&a,&b,&c,&d,&e,&f,&g,&h,&i,&res1,&res2);

    printf("Function 3:\n--------------------\nresult 1: %f\nresult 2:
%f\n\n",res1,res2);

    return 0;

}



--------------------------------------------

Compiled with the following options:
-fno-uncerscoring
-fno-range-check
-W
-std=f95


-- 
           Summary: Some math expressions containing exponents fail on a
                    Windows 64 build
           Product: gcc
           Version: 4.4.0
            Status: UNCONFIRMED
          Severity: blocker
          Priority: P3
         Component: fortran
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: jonathan dot d dot wetherbee at saic dot com


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40070

Reply via email to