ID: Q116241
1.00 1.50 WINDOWS kbtool kbbuglist
The information in this article applies to:
- Microsoft Visual C++ for Windows, versions 1.0 and 1.5
The use of the global-register-allocation optimization switch, /Oe, on floating-point intensive code, such as in the sample below, can generate incorrect results.
There are several methods that can be used to work around this problem:
-or-
-or-
#pragma optimize("",off)
void bad_function()
{
/* ... */
}
#pragma optimize("",on)
-or-
-or-
Microsoft has confirmed this to be a bug with the C/C++ compiler for MS-DOS, versions 8.0 and 8.0c. We are researching the problem and will post new information here in the Microsoft Knowledge Base as it becomes available.
The problem does not occur with the 32-bit C/C++ compiler.
The following sample code can be used to demonstrate this problem:
/* Compile options needed: /Oe
*/
#include <stdio.h>
#include <math.h>
void junk(void)
{
}
void main(void)
{
double x, y, x1 = 623.0, x2 = 724.0, y1 = 308.0, y2 = 244.0;
double angle1 = 325, angle2 = 265;
#ifdef FIX
volatile double m1 = -0.70, m2 = 11.43;
#else
double m1 = -0.70, m2 = 11.43;
#endif
m1 = tan( (double)angle1 / 180.0 * 3.1415926535 );
m2 = tan( (double)angle2 / 180.0 * 3.1415926535 );
if( fabs( m1 ) > 99999 )
{
x = x1;
y = m2 * ( x - x2 ) + y2;
}
else if( fabs( m2 ) > 99999 )
{
x = x2;
y = m1 * ( x - x1 ) + y1;
}
else
{
// Bad optimizations occur in this code
// Uncomment this line to fix the problem
// junk();
x = ( m1 * x1 - m2 * x2 - y1 + y2 ) / ( m1 - m2 );
y = m1 * ( x - x1 ) + y1;
}
printf ("x = %f, y = %f\n",x, y);
}
x = -723.445934, y = 1250.791593
x = 723.445934, y = 237.667000
Additional reference words: 1.00 1.50 8.00 8.00c
KBCategory: kbtool kbbuglist
KBSubcategory: CodeGen
Keywords : kb16bitonly
Last Reviewed: July 23, 1997