mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 01:47:38 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			186 lines
		
	
	
	
		
			5.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			186 lines
		
	
	
	
		
			5.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|      ---------------------------------------------------------------------  
 | |
|     /                       Copyright (c) 1996.                           \ 
 | |
|    |          The Regents of the University of California.                 |
 | |
|    |                        All rights reserved.                           |
 | |
|    |                                                                       |
 | |
|    |   Permission to use, copy, modify, and distribute this software for   |
 | |
|    |   any purpose without fee is hereby granted, provided that this en-   |
 | |
|    |   tire notice is included in all copies of any software which is or   |
 | |
|    |   includes  a  copy  or  modification  of  this software and in all   |
 | |
|    |   copies of the supporting documentation for such software.           |
 | |
|    |                                                                       |
 | |
|    |   This  work was produced at the University of California, Lawrence   |
 | |
|    |   Livermore National Laboratory under  contract  no.  W-7405-ENG-48   |
 | |
|    |   between  the  U.S.  Department  of  Energy and The Regents of the   |
 | |
|    |   University of California for the operation of UC LLNL.              |
 | |
|    |                                                                       |
 | |
|    |                              DISCLAIMER                               |
 | |
|    |                                                                       |
 | |
|    |   This  software was prepared as an account of work sponsored by an   |
 | |
|    |   agency of the United States Government. Neither the United States   |
 | |
|    |   Government  nor the University of California nor any of their em-   |
 | |
|    |   ployees, makes any warranty, express or implied, or  assumes  any   |
 | |
|    |   liability  or  responsibility  for the accuracy, completeness, or   |
 | |
|    |   usefulness of any information,  apparatus,  product,  or  process   |
 | |
|    |   disclosed,   or  represents  that  its  use  would  not  infringe   |
 | |
|    |   privately-owned rights. Reference herein to any specific  commer-   |
 | |
|    |   cial  products,  process,  or  service  by trade name, trademark,   |
 | |
|    |   manufacturer, or otherwise, does not  necessarily  constitute  or   |
 | |
|    |   imply  its endorsement, recommendation, or favoring by the United   |
 | |
|    |   States Government or the University of California. The views  and   |
 | |
|    |   opinions  of authors expressed herein do not necessarily state or   |
 | |
|    |   reflect those of the United States Government or  the  University   |
 | |
|    |   of  California,  and shall not be used for advertising or product   |
 | |
|     \  endorsement purposes.                                              / 
 | |
|      ---------------------------------------------------------------------  
 | |
| */
 | |
| 
 | |
| /*
 | |
| 		  Floating point exception test module.
 | |
| 
 | |
|  */
 | |
| 
 | |
| #include "Python.h"
 | |
| 
 | |
| static PyObject *fpe_error;
 | |
| PyMODINIT_FUNC initfpetest(void);
 | |
| static PyObject *test(PyObject *self,PyObject *args);
 | |
| static double db0(double);
 | |
| static double overflow(double);
 | |
| static double nest1(int, double);
 | |
| static double nest2(int, double);
 | |
| static double nest3(double);
 | |
| static void printerr(double);
 | |
| 
 | |
| static PyMethodDef fpetest_methods[] = {
 | |
|     {"test",		 (PyCFunction) test,		 METH_VARARGS},
 | |
|     {0,0}
 | |
| };
 | |
| 
 | |
| static PyObject *test(PyObject *self,PyObject *args)
 | |
| {
 | |
|     double r;
 | |
| 
 | |
|     fprintf(stderr,"overflow");
 | |
|     r = overflow(1.e160);
 | |
|     printerr(r);
 | |
| 
 | |
|     fprintf(stderr,"\ndiv by 0");
 | |
|     r = db0(0.0);
 | |
|     printerr(r);
 | |
| 
 | |
|     fprintf(stderr,"\nnested outer");
 | |
|     r = nest1(0, 0.0);
 | |
|     printerr(r);
 | |
| 
 | |
|     fprintf(stderr,"\nnested inner");
 | |
|     r = nest1(1, 1.0);
 | |
|     printerr(r);
 | |
| 
 | |
|     fprintf(stderr,"\ntrailing outer");
 | |
|     r = nest1(2, 2.0);
 | |
|     printerr(r);
 | |
| 
 | |
|     fprintf(stderr,"\nnested prior");
 | |
|     r = nest2(0, 0.0);
 | |
|     printerr(r);
 | |
| 
 | |
|     fprintf(stderr,"\nnested interior");
 | |
|     r = nest2(1, 1.0);
 | |
|     printerr(r);
 | |
| 
 | |
|     fprintf(stderr,"\nnested trailing");
 | |
|     r = nest2(2, 2.0);
 | |
|     printerr(r);
 | |
| 
 | |
|     Py_INCREF (Py_None);
 | |
|     return Py_None;
 | |
| }
 | |
| 
 | |
| static void printerr(double r)
 | |
| {
 | |
|     if(r == 3.1416){
 | |
|       fprintf(stderr,"\tPASS\n");
 | |
|       PyErr_Print();
 | |
|     }else{
 | |
|       fprintf(stderr,"\tFAIL\n");
 | |
|     }
 | |
|     PyErr_Clear();
 | |
| }
 | |
| 
 | |
| static double nest1(int i, double x)
 | |
| {
 | |
|   double a = 1.0;
 | |
| 
 | |
|   PyFPE_START_PROTECT("Division by zero, outer zone", return 3.1416)
 | |
|   if(i == 0){
 | |
|     a = 1./x;
 | |
|   }else if(i == 1){
 | |
|     /* This (following) message is never seen. */
 | |
|     PyFPE_START_PROTECT("Division by zero, inner zone", return 3.1416)
 | |
|     a = 1./(1. - x);
 | |
|     PyFPE_END_PROTECT(a)
 | |
|   }else if(i == 2){
 | |
|     a = 1./(2. - x);
 | |
|   }
 | |
|   PyFPE_END_PROTECT(a)
 | |
| 
 | |
|   return a;
 | |
| }
 | |
| 
 | |
| static double nest2(int i, double x)
 | |
| {
 | |
|   double a = 1.0;
 | |
|   PyFPE_START_PROTECT("Division by zero, prior error", return 3.1416)
 | |
|   if(i == 0){
 | |
|     a = 1./x;
 | |
|   }else if(i == 1){
 | |
|     a = nest3(x);
 | |
|   }else if(i == 2){
 | |
|     a = 1./(2. - x);
 | |
|   }
 | |
|   PyFPE_END_PROTECT(a)
 | |
|   return a;
 | |
| }
 | |
| 
 | |
| static double nest3(double x)
 | |
| {
 | |
|   double result;
 | |
|   /* This (following) message is never seen. */
 | |
|   PyFPE_START_PROTECT("Division by zero, nest3 error", return 3.1416)
 | |
|   result = 1./(1. - x);
 | |
|   PyFPE_END_PROTECT(result)
 | |
|   return result;
 | |
| }
 | |
| 
 | |
| static double db0(double x)
 | |
| {
 | |
|   double a;
 | |
|   PyFPE_START_PROTECT("Division by zero", return 3.1416)
 | |
|   a = 1./x;
 | |
|   PyFPE_END_PROTECT(a)
 | |
|   return a;
 | |
| }
 | |
| 
 | |
| static double overflow(double b)
 | |
| {
 | |
|   double a;
 | |
|   PyFPE_START_PROTECT("Overflow", return 3.1416)
 | |
|   a = b*b;
 | |
|   PyFPE_END_PROTECT(a)
 | |
|   return a;
 | |
| }
 | |
| 
 | |
| PyMODINIT_FUNC initfpetest(void)
 | |
| {
 | |
|     PyObject *m, *d;
 | |
| 
 | |
|     m = Py_InitModule("fpetest", fpetest_methods);
 | |
|     if (m == NULL)
 | |
|     	return;
 | |
|     d = PyModule_GetDict(m);
 | |
|     fpe_error = PyErr_NewException("fpetest.error", NULL, NULL);
 | |
|     if (fpe_error != NULL)
 | |
| 	    PyDict_SetItemString(d, "error", fpe_error);
 | |
| }
 | 
