Skip to content

Commit

Permalink
pxd file for the NumPy core math library (npymath)
Browse files Browse the repository at this point in the history
  • Loading branch information
larsmans committed Sep 7, 2013
1 parent 9526f6b commit 0b73f7d
Show file tree
Hide file tree
Showing 5 changed files with 113 additions and 0 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ __pycache__
Cython/Compiler/*.c
Cython/Plex/*.c
Cython/Runtime/refnanny.c
Cython/Tempita/*.c

Tools/*.elc

Expand Down
File renamed without changes.
50 changes: 50 additions & 0 deletions Cython/Includes/numpy/math.pxd
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# NumPy math library
#
# This exports the functionality of the NumPy core math library, aka npymath,
# which provides implementations of C99 math functions and macros for system
# with a C89 library (such as MSVC). npymath is available with NumPy >=1.3,
# although some functions will require later versions. The spacing function is
# not in C99, but comes from Fortran.
#
# On the Cython side, the npymath functions are available without the "npy_"
# prefix that they have in C, to make this is a drop-in replacement for
# libc.math. The same is true for the constants, where possible.
#
# See the NumPy documentation for linking instructions.
#
# Complex number support and NumPy 2.0 half-precision functions are currently
# not exported.
#
# Author: Lars Buitinck

cdef extern from "numpy/npy_math.h":
# Floating-point classification
long double NAN "NPY_NAN"
long double INFINITY "NPY_INFINITY"
long double PZERO "NPY_PZERO" # positive zero
long double NZERO "NPY_NZERO" # negative zero

# These four are actually macros and work on any floating-point type.
bint isfinite "npy_isfinite"(long double)
bint isinf "npy_isinf"(long double)
bint isnan "npy_isnan"(long double)
bint signbit "npy_signbit"(long double)

double copysign "npy_copysign"(double, double)

# Math constants
long double E "NPY_E"
long double LOG2E "NPY_LOG2E" # ln(e) / ln(2)
long double LOG10E "NPY_LOG10E" # ln(e) / ln(10)
long double LOGE2 "NPY_LOGE2" # ln(2)
long double LOGE10 "NPY_LOGE10" # ln(10)
long double PI "NPY_PI"
long double PI_2 "NPY_PI_2" # pi / 2
long double PI_4 "NPY_PI_4" # pi / 4
long double NPY_1_PI # 1 / pi; NPY_ because of ident syntax
long double NPY_2_PI # 2 / pi
long double EULER "NPY_EULER" # Euler constant (gamma, 0.57721)

# Low-level floating point manipulation (NumPy >=1.4)
double nextafter "npy_nextafter"(double x, double y)
double spacing "npy_spacing"(double x)
7 changes: 7 additions & 0 deletions runtests.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,8 +115,15 @@ def update_linetrace_extension(ext):

def update_numpy_extension(ext):
import numpy
from numpy.distutils.misc_util import get_info

ext.include_dirs.append(numpy.get_include())

# We need the npymath library for numpy.math.
# This is typically a static-only library.
for attr, value in get_info('npymath').items():
getattr(ext, attr).extend(value)

def update_openmp_extension(ext):
ext.openmp = True
language = ext.language
Expand Down
55 changes: 55 additions & 0 deletions tests/run/numpy_math.pyx
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# tag: numpy

cimport numpy.math as npmath


def test_fp_classif():
"""
>>> test_fp_classif()
"""

cdef double d_zero
cdef float f_zero

d_zero = -1 * 0.
f_zero = -1 * 0.

assert d_zero == npmath.NZERO
assert f_zero == npmath.NZERO

assert npmath.signbit(d_zero)
assert npmath.signbit(f_zero)

d_zero = 1 * 0.
f_zero = 1 * 0.

assert d_zero == npmath.PZERO
assert f_zero == npmath.PZERO

assert not npmath.signbit(d_zero)
assert not npmath.signbit(f_zero)

assert not npmath.isinf(d_zero)
assert not npmath.isinf(f_zero)

assert not npmath.isnan(d_zero)
assert not npmath.isnan(f_zero)

assert npmath.isinf(npmath.INFINITY)
assert npmath.isnan(npmath.NAN)

assert npmath.signbit(npmath.copysign(1., -1.))


def test_nextafter():
"""
>>> test_nextafter()
"""

x = npmath.nextafter(npmath.EULER, 1)
assert npmath.isfinite(x)
assert x > npmath.EULER

x = npmath.nextafter(npmath.PI_4, -1)
assert npmath.isfinite(x)
assert x < npmath.PI_4

0 comments on commit 0b73f7d

Please sign in to comment.