181 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			181 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
| 
 | |
| #include "test.h"
 | |
| #include <ieeefp.h>
 | |
| 
 | |
| 
 | |
| /* Test fp getround and fp setround */
 | |
| 
 | |
| void
 | |
| _DEFUN_VOID(test_getround)
 | |
| {
 | |
| 
 | |
|   newfunc("fpgetround/fpsetround");
 | |
|   line(1);
 | |
|   fpsetround(FP_RN);
 | |
|   test_iok(fpgetround(), FP_RN);
 | |
|   line(2);
 | |
|   fpsetround(FP_RM);
 | |
|   test_iok(fpgetround(), FP_RM);
 | |
|   line(3);  
 | |
|   fpsetround(FP_RP);
 | |
|   test_iok(fpgetround(), FP_RP);
 | |
|   line(4);  
 | |
|   fpsetround(FP_RZ);
 | |
|   test_iok(fpgetround(), FP_RZ);
 | |
| }
 | |
| 
 | |
| /* And fpset/fpgetmask */
 | |
| void
 | |
| _DEFUN_VOID(test_getmask)
 | |
| {
 | |
|   newfunc("fpsetmask/fpgetmask");
 | |
|   line(1);
 | |
|   fpsetmask(FP_X_INV);
 | |
|   test_iok(fpgetmask(),FP_X_INV);
 | |
|   line(2);
 | |
|   fpsetmask(FP_X_DX);
 | |
|   test_iok(fpgetmask(),FP_X_DX);
 | |
|   line(3);
 | |
|   fpsetmask(FP_X_OFL );
 | |
|   test_iok(fpgetmask(),FP_X_OFL);
 | |
|   line(4);  
 | |
|   fpsetmask(FP_X_UFL);
 | |
|   test_iok(fpgetmask(),FP_X_UFL);
 | |
|   line(5);  
 | |
|   fpsetmask(FP_X_IMP);
 | |
|   test_iok(fpgetmask(),FP_X_IMP);
 | |
| }
 | |
| 
 | |
| void
 | |
| _DEFUN_VOID(test_getsticky)
 | |
| {
 | |
|   newfunc("fpsetsticky/fpgetsticky");
 | |
|   line(1);
 | |
|   fpsetsticky(FP_X_INV);
 | |
|   test_iok(fpgetsticky(),FP_X_INV);
 | |
|   line(2);
 | |
|   fpsetsticky(FP_X_DX);
 | |
|   test_iok(fpgetsticky(),FP_X_DX);
 | |
|   line(3);
 | |
|   fpsetsticky(FP_X_OFL );
 | |
|   test_iok(fpgetsticky(),FP_X_OFL);
 | |
|   line(4);  
 | |
|   fpsetsticky(FP_X_UFL);
 | |
|   test_iok(fpgetsticky(),FP_X_UFL);
 | |
|   line(5);  
 | |
|   fpsetsticky(FP_X_IMP);
 | |
|   test_iok(fpgetsticky(),FP_X_IMP);
 | |
| }
 | |
| 
 | |
| void
 | |
| _DEFUN_VOID(test_getroundtoi)
 | |
| {
 | |
|   newfunc("fpsetroundtoi/fpgetroundtoi");
 | |
|   line(1);
 | |
|   fpsetroundtoi(FP_RDI_TOZ);
 | |
|   test_iok(fpgetroundtoi(),FP_RDI_TOZ);
 | |
| 
 | |
|   line(2);
 | |
|   fpsetroundtoi(FP_RDI_RD);
 | |
|   test_iok(fpgetroundtoi(),FP_RDI_RD);
 | |
| 
 | |
| }
 | |
| 
 | |
| double
 | |
|  _DEFUN(dnumber,(msw, lsw),
 | |
| 	int msw _AND
 | |
| 	int lsw)
 | |
| {
 | |
|   
 | |
|   __ieee_double_shape_type v;
 | |
|   v.parts.lsw = lsw;
 | |
|   v.parts.msw = msw;
 | |
|   return v.value;
 | |
| }
 | |
| 
 | |
|   /* Lets see if changing the rounding alters the arithmetic.
 | |
|      Test by creating numbers which will have to be rounded when
 | |
|      added, and seeing what happens to them */
 | |
|  /* Keep them out here to stop  the compiler from folding the results */
 | |
| double n;
 | |
| double m;
 | |
| double add_rounded_up;
 | |
| double add_rounded_down;
 | |
| double sub_rounded_down ;
 | |
| double sub_rounded_up ;
 | |
|   double r1,r2,r3,r4;
 | |
| void
 | |
| _DEFUN_VOID(test_round)
 | |
| {
 | |
|   n =                dnumber(0x40000000, 0x00000008); /* near 2 */
 | |
|   m =                dnumber(0x40400000, 0x00000003); /* near 3.4 */
 | |
|   
 | |
|   add_rounded_up   = dnumber(0x40410000, 0x00000004); /* For RN, RP */
 | |
|   add_rounded_down = dnumber(0x40410000, 0x00000003); /* For RM, RZ */
 | |
|   sub_rounded_down = dnumber(0xc0410000, 0x00000004); /* for RN, RM */
 | |
|   sub_rounded_up   = dnumber(0xc0410000, 0x00000003); /* for RP, RZ */
 | |
| 
 | |
|   newfunc("fpsetround");
 | |
|   
 | |
|   line(1);
 | |
|   
 | |
|   fpsetround(FP_RN);
 | |
|   r1 = n + m;
 | |
|   test_mok(r1, add_rounded_up, 64);
 | |
|   
 | |
|   line(2);
 | |
|   fpsetround(FP_RM);
 | |
|   r2 = n + m;
 | |
|   test_mok(r2, add_rounded_down, 64);
 | |
|   
 | |
|   fpsetround(FP_RP);
 | |
|   line(3);
 | |
|   r3 = n + m;
 | |
|   test_mok(r3,add_rounded_up, 64);
 | |
|   
 | |
|   fpsetround(FP_RZ);
 | |
|   line(4);
 | |
|   r4 = n + m;
 | |
|   test_mok(r4,add_rounded_down,64);
 | |
| 
 | |
| 
 | |
|   fpsetround(FP_RN);
 | |
|   r1 = - n - m;
 | |
|   line(5);
 | |
|   test_mok(r1,sub_rounded_down,64);
 | |
|   
 | |
|   fpsetround(FP_RM);
 | |
|   r2 = - n - m;
 | |
|   line(6);
 | |
|   test_mok(r2,sub_rounded_down,64);
 | |
| 
 | |
| 
 | |
|   fpsetround(FP_RP);
 | |
|   r3 = - n - m;
 | |
|   line(7);
 | |
|   test_mok(r3,sub_rounded_up,64);
 | |
| 
 | |
|   fpsetround(FP_RZ);
 | |
|   r4 = - n - m;
 | |
|   line(8);
 | |
|   test_mok(r4,sub_rounded_up,64);
 | |
| }
 | |
| 
 | |
| 
 | |
| void
 | |
| _DEFUN_VOID(test_ieee)
 | |
| {
 | |
|   fp_rnd old = fpgetround();
 | |
|   test_getround();
 | |
|   test_getmask();
 | |
|   test_getsticky();
 | |
|   test_getroundtoi();
 | |
| 
 | |
|   test_round();
 | |
|   fpsetround(old);
 | |
| 
 | |
|   
 | |
| }
 | |
| 
 | |
| 
 |