Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
STY: C style cleanup.
Omitted numpy/core/src/npymath/test_c99complex.c, which is a jungle
of macro magic.
  • Loading branch information
charris committed Jan 27, 2015
commit ff5a1c2a949516277ff373c134e999d97cf0d68e
92 changes: 61 additions & 31 deletions numpy/core/src/npymath/fpstatus.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@
defined(__NetBSD__)
#include <ieeefp.h>

int npy_get_floatstatus(void)
int
npy_get_floatstatus(void)
{
int fpstatus = fpgetsticky();
return ((FP_X_DZ & fpstatus) ? NPY_FPE_DIVIDEBYZERO : 0) |
Expand All @@ -31,30 +32,35 @@ int npy_get_floatstatus(void)
((FP_X_INV & fpstatus) ? NPY_FPE_INVALID : 0);
}

int npy_clear_floatstatus(void)
int
npy_clear_floatstatus(void)
{
int fpstatus = npy_get_floatstatus();
fpsetsticky(0);

return fpstatus;
}

void npy_set_floatstatus_divbyzero(void)
void
npy_set_floatstatus_divbyzero(void)
{
fpsetsticky(FP_X_DZ);
}

void npy_set_floatstatus_overflow(void)
void
npy_set_floatstatus_overflow(void)
{
fpsetsticky(FP_X_OFL);
}

void npy_set_floatstatus_underflow(void)
void
npy_set_floatstatus_underflow(void)
{
fpsetsticky(FP_X_UFL);
}

void npy_set_floatstatus_invalid(void)
void
npy_set_floatstatus_invalid(void)
{
fpsetsticky(FP_X_INV);
}
Expand All @@ -71,7 +77,8 @@ void npy_set_floatstatus_invalid(void)
# include "numpy/fenv/fenv.h"
# endif

int npy_get_floatstatus(void)
int
npy_get_floatstatus(void)
{
int fpstatus = fetestexcept(FE_DIVBYZERO | FE_OVERFLOW |
FE_UNDERFLOW | FE_INVALID);
Expand All @@ -82,7 +89,8 @@ int npy_get_floatstatus(void)
((FE_INVALID & fpstatus) ? NPY_FPE_INVALID : 0);
}

int npy_clear_floatstatus(void)
int
npy_clear_floatstatus(void)
{
/* testing float status is 50-100 times faster than clearing on x86 */
int fpstatus = npy_get_floatstatus();
Expand All @@ -95,22 +103,26 @@ int npy_clear_floatstatus(void)
}


void npy_set_floatstatus_divbyzero(void)
void
npy_set_floatstatus_divbyzero(void)
{
feraiseexcept(FE_DIVBYZERO);
}

void npy_set_floatstatus_overflow(void)
void
npy_set_floatstatus_overflow(void)
{
feraiseexcept(FE_OVERFLOW);
}

void npy_set_floatstatus_underflow(void)
void
npy_set_floatstatus_underflow(void)
{
feraiseexcept(FE_UNDERFLOW);
}

void npy_set_floatstatus_invalid(void)
void
npy_set_floatstatus_invalid(void)
{
feraiseexcept(FE_INVALID);
}
Expand All @@ -119,7 +131,8 @@ void npy_set_floatstatus_invalid(void)
#include <float.h>
#include <fpxcp.h>

int npy_get_floatstatus(void)
int
npy_get_floatstatus(void)
{
int fpstatus = fp_read_flag();
return ((FP_DIV_BY_ZERO & fpstatus) ? NPY_FPE_DIVIDEBYZERO : 0) |
Expand All @@ -128,25 +141,29 @@ int npy_get_floatstatus(void)
((FP_INVALID & fpstatus) ? NPY_FPE_INVALID : 0);
}

int npy_clear_floatstatus(void)
int
npy_clear_floatstatus(void)
{
int fpstatus = npy_get_floatstatus();
fp_swap_flag(0);

return fpstatus;
}

void npy_set_floatstatus_divbyzero(void)
void
npy_set_floatstatus_divbyzero(void)
{
fp_raise_xcp(FP_DIV_BY_ZERO);
}

void npy_set_floatstatus_overflow(void)
void
npy_set_floatstatus_overflow(void)
{
fp_raise_xcp(FP_OVERFLOW);
}

void npy_set_floatstatus_underflow(void)
void
npy_set_floatstatus_underflow(void)
{
fp_raise_xcp(FP_UNDERFLOW);
}
Expand All @@ -164,7 +181,8 @@ void npy_set_floatstatus_invalid(void)
#include <float.h>


int npy_get_floatstatus(void)
int
npy_get_floatstatus(void)
{
#if defined(_WIN64)
int fpstatus = _statusfp();
Expand All @@ -180,7 +198,8 @@ int npy_get_floatstatus(void)
((SW_INVALID & fpstatus) ? NPY_FPE_INVALID : 0);
}

int npy_clear_floatstatus(void)
int
npy_clear_floatstatus(void)
{
int fpstatus = npy_get_floatstatus();
_clearfp();
Expand All @@ -193,16 +212,19 @@ int npy_clear_floatstatus(void)

#include <machine/fpu.h>

int npy_get_floatstatus(void)
int
npy_get_floatstatus(void)
{
unsigned long fpstatus = ieee_get_fp_control();

return ((IEEE_STATUS_DZE & fpstatus) ? NPY_FPE_DIVIDEBYZERO : 0) |
((IEEE_STATUS_OVF & fpstatus) ? NPY_FPE_OVERFLOW : 0) |
((IEEE_STATUS_UNF & fpstatus) ? NPY_FPE_UNDERFLOW : 0) |
((IEEE_STATUS_INV & fpstatus) ? NPY_FPE_INVALID : 0);
}

int npy_clear_floatstatus(void)
int
npy_clear_floatstatus(void)
{
long fpstatus = npy_get_floatstatus();
/* clear status bits as well as disable exception mode if on */
Expand All @@ -213,12 +235,14 @@ int npy_clear_floatstatus(void)

#else

int npy_get_floatstatus(void)
int
npy_get_floatstatus(void)
{
return 0;
}

int npy_clear_floatstatus(void)
int
npy_clear_floatstatus(void)
{
return 0;
}
Expand All @@ -234,26 +258,32 @@ int npy_clear_floatstatus(void)
* global here, because that would cause
* a race condition.
*/
static volatile double _npy_floatstatus_x,
_npy_floatstatus_zero = 0.0, _npy_floatstatus_big = 1e300,
_npy_floatstatus_small = 1e-300, _npy_floatstatus_inf;

void npy_set_floatstatus_divbyzero(void)
static volatile double _npy_floatstatus_x;
static volatile double _npy_floatstatus_zero = 0.0;
static volatile double _npy_floatstatus_big = 1e300;
static volatile double _npy_floatstatus_small = 1e-300;
static volatile double _npy_floatstatus_inf;

void
npy_set_floatstatus_divbyzero(void)
{
_npy_floatstatus_x = 1.0 / _npy_floatstatus_zero;
}

void npy_set_floatstatus_overflow(void)
void
npy_set_floatstatus_overflow(void)
{
_npy_floatstatus_x = _npy_floatstatus_big * 1e300;
}

void npy_set_floatstatus_underflow(void)
void
npy_set_floatstatus_underflow(void)
{
_npy_floatstatus_x = _npy_floatstatus_small * 1e-300;
}

void npy_set_floatstatus_invalid(void)
void
npy_set_floatstatus_invalid(void)
{
_npy_floatstatus_inf = NPY_INFINITY;
_npy_floatstatus_x = _npy_floatstatus_inf - NPY_INFINITY;
Expand Down
Loading