168 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			168 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * this file contains misc bug reports from WinBond.
 | 
						|
 */
 | 
						|
#include <stdio.h>
 | 
						|
#include <math.h>
 | 
						|
 | 
						|
#if unix
 | 
						|
#define pass(x)	printf("PASS: %s\n", x);
 | 
						|
#define fail(x)	printf("FAIL: %s\n", x);
 | 
						|
#endif
 | 
						|
 | 
						|
/*
 | 
						|
    The compare operation is error. Because the constant value 1.0 is
 | 
						|
    not correct. It seems compare with 0 in this statement.
 | 
						|
 | 
						|
HP-UX native:
 | 
						|
   dist is 0.301
 | 
						|
   PASS: float compare
 | 
						|
   *cp = be9a1cac, *cp1 = be9a1cac
 | 
						|
   PASS: float multiple 1
 | 
						|
   PASS: float multiple 2
 | 
						|
   32760 / (-2) = -16380
 | 
						|
   PASS: float divide 1
 | 
						|
   32760 / (-1) = -32760
 | 
						|
   PASS: float divide 1
 | 
						|
    These test only pass if the output matches:
 | 
						|
    Correct output is
 | 
						|
    1.0 = 1.000000E+00, 0.3010 = 3.000000E-01, -1.0 = -1.000000E+0
 | 
						|
    1.0 = 1.000000E+00, 0.3010 = 3.010000E-01, -1.0 = -1.000000E+00
 | 
						|
    These test only pass if the outut matches:
 | 
						|
    Correct output is
 | 
						|
    ans = 1.000000E+00, ans1 = 3.010000E-01, ans2 = -1.000000E+00
 | 
						|
    ans = 1.000000E+00, ans1 = 3.010000E-01, ans2 = -1.000000E+00
 | 
						|
 | 
						|
 | 
						|
Test run on Oki:
 | 
						|
 | 
						|
    dist is 0
 | 
						|
    PASS: float compare
 | 
						|
    *cp = be9a1cac, *cp1 = be9a1cac
 | 
						|
    PASS: float multiple 1
 | 
						|
    PASS: float multiple 2
 | 
						|
    32760 / (-2) = -2147467268
 | 
						|
    PASS: float divide 1
 | 
						|
    32760 / (-1) = 32760
 | 
						|
    PASS: float divide 1
 | 
						|
    These test only pass if the output matches:
 | 
						|
    Correct output is
 | 
						|
    1.0 = 1.000000E+00, 0.3010 = 3.000000E-01, -1.0 = -1.000000E+0
 | 
						|
    1.0 = 1.586860E-318, 0.3010 = -1.009091E-303, -1.0 = 5.290504E-315
 | 
						|
    These test only pass if the outut matches:
 | 
						|
    Correct output is
 | 
						|
    ans = 1.000000E+00, ans1 = 3.010000E-01, ans2 = -1.000000E+00
 | 
						|
    ans = 4.940656E-324, ans1 = -5.299809E-315, ans2 = 5.290504E-315
 | 
						|
 | 
						|
 */
 | 
						|
 | 
						|
main()
 | 
						|
{
 | 
						|
  float dist = 0.3010;
 | 
						|
 | 
						|
  printf ("dist is %G\n", dist);
 | 
						|
  if ( dist < 1.0 ) {
 | 
						|
    pass ("float compare");
 | 
						|
  } else {
 | 
						|
    fail ("float compare");
 | 
						|
  }
 | 
						|
 | 
						|
  test_1();
 | 
						|
  test_2();
 | 
						|
  test_3();
 | 
						|
  test_4();
 | 
						|
 | 
						|
  fflush (stdout);
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 *    *cp = be9a1cac, *cp1 = 00000000
 | 
						|
 */
 | 
						|
test_1()
 | 
						|
{
 | 
						|
  float i, ans, ans1;
 | 
						|
  unsigned int *cp=&ans, *cp1=&ans1;
 | 
						|
  
 | 
						|
  i = 0.3010;
 | 
						|
  ans = (-1.0) * 0.3010 * 1.0;        /* OK */
 | 
						|
  ans1 = (-1.0) * i * 1.0;            /* Disaster */
 | 
						|
  printf ("*cp = %08x, *cp1 = %08x\n", *cp, *cp1);
 | 
						|
 | 
						|
  if (*cp != 0xbe9a1cac) {
 | 
						|
    fail ("float multiple 1");
 | 
						|
  } else {
 | 
						|
    pass ("float multiple 1");
 | 
						|
  }
 | 
						|
 | 
						|
  if (*cp1 != 0xbe9a1cac) {
 | 
						|
    fail ("float multiple 2");
 | 
						|
  } else {
 | 
						|
    pass ("float multiple 2");
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
    Positive integer divide Negative integer may get interesting result.
 | 
						|
    For examples:
 | 
						|
    EX1: 32760 / (-2) = -2147467268
 | 
						|
 */
 | 
						|
test_2()
 | 
						|
{
 | 
						|
  int value, i, j;
 | 
						|
  
 | 
						|
  i = 32760;
 | 
						|
  j = -2;
 | 
						|
  value = i / (j);
 | 
						|
  printf ("%d / (%d) = %d\n", i, j, value);
 | 
						|
  
 | 
						|
  if (value != -16380) {
 | 
						|
    fail ("float divide 1");
 | 
						|
  } else {
 | 
						|
    pass ("float divide 1");
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
     EX2: 32760 / (-1) = 32760
 | 
						|
 */
 | 
						|
test_3()
 | 
						|
{
 | 
						|
  int value, i, j;
 | 
						|
  
 | 
						|
  i = 32760;
 | 
						|
  j = -1;
 | 
						|
  value = i / (j);
 | 
						|
  printf ("%d / (%d) = %d\n", i, j, value);
 | 
						|
 | 
						|
  if (value != -32760) {
 | 
						|
    fail ("float divide 1");
 | 
						|
  } else {
 | 
						|
    pass ("float divide 1");
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
    The data output format %e, %E, %g, %G in printf() can not work.
 | 
						|
    Please test the following example:
 | 
						|
 | 
						|
    1.0 = 1.000000E+00, 0.3010 = 3.009999E-01, -1.0 = -1.000000E+00
 | 
						|
    ans = 4.940656E-324, ans1 = -5.299809E-315, ans2 = 5.290504E-315
 | 
						|
 */
 | 
						|
test_4()
 | 
						|
{
 | 
						|
  float ans, ans1, ans2;
 | 
						|
  
 | 
						|
  ans = 1.0;
 | 
						|
  ans1 = 0.3010;
 | 
						|
  ans2 = -1.0;
 | 
						|
 | 
						|
  printf ("These test only pass if the output matches:\nCorrect output is\n1.0 = 1.000000E+00, 0.3010 = 3.000000E-01, -1.0 = -1.000000E+0\n");
 | 
						|
  printf ("1.0 = %E, 0.3010 = %E, -1.0 = %E\n", 1.0, 0.3010, -1.0);
 | 
						|
  printf ("These test only pass if the outut matches:\nCorrect output is\nans = 1.000000E+00, ans1 = 3.010000E-01, ans2 = -1.000000E+00\n");
 | 
						|
  printf ("ans = %E, ans1 = %E, ans2 = %E\n", ans, ans1, ans2);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 |