tmp
/
pip-install-ghxuqwgs
/numpy_78e94bf2b6094bf9a1f3d92042f9bf46
/doc
/source
/reference
/c-api.coremath.rst
Numpy core libraries | |
==================== | |
.. sectionauthor:: David Cournapeau | |
.. versionadded:: 1.3.0 | |
Starting from numpy 1.3.0, we are working on separating the pure C, | |
"computational" code from the python dependent code. The goal is twofolds: | |
making the code cleaner, and enabling code reuse by other extensions outside | |
numpy (scipy, etc...). | |
Numpy core math library | |
----------------------- | |
The numpy core math library ('npymath') is a first step in this direction. This | |
library contains most math-related C99 functionality, which can be used on | |
platforms where C99 is not well supported. The core math functions have the | |
same API as the C99 ones, except for the npy_* prefix. | |
The available functions are defined in <numpy/npy_math.h> - please refer to this header when | |
in doubt. | |
Floating point classification | |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
.. cvar:: NPY_NAN | |
This macro is defined to a NaN (Not a Number), and is guaranteed to have | |
the signbit unset ('positive' NaN). The corresponding single and extension | |
precision macro are available with the suffix F and L. | |
.. cvar:: NPY_INFINITY | |
This macro is defined to a positive inf. The corresponding single and | |
extension precision macro are available with the suffix F and L. | |
.. cvar:: NPY_PZERO | |
This macro is defined to positive zero. The corresponding single and | |
extension precision macro are available with the suffix F and L. | |
.. cvar:: NPY_NZERO | |
This macro is defined to negative zero (that is with the sign bit set). The | |
corresponding single and extension precision macro are available with the | |
suffix F and L. | |
.. cfunction:: int npy_isnan(x) | |
This is a macro, and is equivalent to C99 isnan: works for single, double | |
and extended precision, and return a non 0 value is x is a NaN. | |
.. cfunction:: int npy_isfinite(x) | |
This is a macro, and is equivalent to C99 isfinite: works for single, | |
double and extended precision, and return a non 0 value is x is neither a | |
NaN nor an infinity. | |
.. cfunction:: int npy_isinf(x) | |
This is a macro, and is equivalent to C99 isinf: works for single, double | |
and extended precision, and return a non 0 value is x is infinite (positive | |
and negative). | |
.. cfunction:: int npy_signbit(x) | |
This is a macro, and is equivalent to C99 signbit: works for single, double | |
and extended precision, and return a non 0 value is x has the signbit set | |
(that is the number is negative). | |
.. cfunction:: double npy_copysign(double x, double y) | |
This is a function equivalent to C99 copysign: return x with the same sign | |
as y. Works for any value, including inf and nan. Single and extended | |
precisions are available with suffix f and l. | |
.. versionadded:: 1.4.0 | |
Useful math constants | |
~~~~~~~~~~~~~~~~~~~~~ | |
The following math constants are available in npy_math.h. Single and extended | |
precision are also available by adding the F and L suffixes respectively. | |
.. cvar:: NPY_E | |
Base of natural logarithm (:math:`e`) | |
.. cvar:: NPY_LOG2E | |
Logarithm to base 2 of the Euler constant (:math:`\frac{\ln(e)}{\ln(2)}`) | |
.. cvar:: NPY_LOG10E | |
Logarithm to base 10 of the Euler constant (:math:`\frac{\ln(e)}{\ln(10)}`) | |
.. cvar:: NPY_LOGE2 | |
Natural logarithm of 2 (:math:`\ln(2)`) | |
.. cvar:: NPY_LOGE10 | |
Natural logarithm of 10 (:math:`\ln(10)`) | |
.. cvar:: NPY_PI | |
Pi (:math:`\pi`) | |
.. cvar:: NPY_PI_2 | |
Pi divided by 2 (:math:`\frac{\pi}{2}`) | |
.. cvar:: NPY_PI_4 | |
Pi divided by 4 (:math:`\frac{\pi}{4}`) | |
.. cvar:: NPY_1_PI | |
Reciprocal of pi (:math:`\frac{1}{\pi}`) | |
.. cvar:: NPY_2_PI | |
Two times the reciprocal of pi (:math:`\frac{2}{\pi}`) | |
.. cvar:: NPY_EULER | |
The Euler constant | |
:math:`\lim_{n\rightarrow\infty}({\sum_{k=1}^n{\frac{1}{k}}-\ln n})` | |
Low-level floating point manipulation | |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
Those can be useful for precise floating point comparison. | |
.. cfunction:: double npy_nextafter(double x, double y) | |
This is a function equivalent to C99 nextafter: return next representable | |
floating point value from x in the direction of y. Single and extended | |
precisions are available with suffix f and l. | |
.. versionadded:: 1.4.0 | |
.. cfunction:: double npy_spacing(double x) | |
This is a function equivalent to Fortran intrinsic. Return distance between | |
x and next representable floating point value from x, e.g. spacing(1) == | |
eps. spacing of nan and +/- inf return nan. Single and extended precisions | |
are available with suffix f and l. | |
.. versionadded:: 1.4.0 | |
.. cfunction:: void npy_set_floatstatus_divbyzero() | |
Set the divide by zero floating point exception | |
.. versionadded:: 1.6.0 | |
.. cfunction:: void npy_set_floatstatus_overflow() | |
Set the overflow floating point exception | |
.. versionadded:: 1.6.0 | |
.. cfunction:: void npy_set_floatstatus_underflow() | |
Set the underflow floating point exception | |
.. versionadded:: 1.6.0 | |
.. cfunction:: void npy_set_floatstatus_invalid() | |
Set the invalid floating point exception | |
.. versionadded:: 1.6.0 | |
.. cfunction:: int npy_get_floatstatus() | |
Get floating point status. Returns a bitmask with following possible flags: | |
* NPY_FPE_DIVIDEBYZERO | |
* NPY_FPE_OVERFLOW | |
* NPY_FPE_UNDERFLOW | |
* NPY_FPE_INVALID | |
.. versionadded:: 1.9.0 | |
.. cfunction:: int npy_clear_floatstatus() | |
Clears the floating point status. Returns the previous status mask. | |
.. versionadded:: 1.9.0 | |
Complex functions | |
~~~~~~~~~~~~~~~~~ | |
.. versionadded:: 1.4.0 | |
C99-like complex functions have been added. Those can be used if you wish to | |
implement portable C extensions. Since we still support platforms without C99 | |
complex type, you need to restrict to C90-compatible syntax, e.g.: | |
.. code-block:: c | |
/* a = 1 + 2i \*/ | |
npy_complex a = npy_cpack(1, 2); | |
npy_complex b; | |
b = npy_log(a); | |
Linking against the core math library in an extension | |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
.. versionadded:: 1.4.0 | |
To use the core math library in your own extension, you need to add the npymath | |
compile and link options to your extension in your setup.py: | |
>>> from numpy.distutils.misc_util import get_info | |
>>> info = get_info('npymath') | |
>>> config.add_extension('foo', sources=['foo.c'], extra_info=info) | |
In other words, the usage of info is exactly the same as when using blas_info | |
and co. | |
Half-precision functions | |
~~~~~~~~~~~~~~~~~~~~~~~~ | |
.. versionadded:: 2.0.0 | |
The header file <numpy/halffloat.h> provides functions to work with | |
IEEE 754-2008 16-bit floating point values. While this format is | |
not typically used for numerical computations, it is useful for | |
storing values which require floating point but do not need much precision. | |
It can also be used as an educational tool to understand the nature | |
of floating point round-off error. | |
Like for other types, NumPy includes a typedef npy_half for the 16 bit | |
float. Unlike for most of the other types, you cannot use this as a | |
normal type in C, since is is a typedef for npy_uint16. For example, | |
1.0 looks like 0x3c00 to C, and if you do an equality comparison | |
between the different signed zeros, you will get -0.0 != 0.0 | |
(0x8000 != 0x0000), which is incorrect. | |
For these reasons, NumPy provides an API to work with npy_half values | |
accessible by including <numpy/halffloat.h> and linking to 'npymath'. | |
For functions that are not provided directly, such as the arithmetic | |
operations, the preferred method is to convert to float | |
or double and back again, as in the following example. | |
.. code-block:: c | |
npy_half sum(int n, npy_half *array) { | |
float ret = 0; | |
while(n--) { | |
ret += npy_half_to_float(*array++); | |
} | |
return npy_float_to_half(ret); | |
} | |
External Links: | |
* `754-2008 IEEE Standard for Floating-Point Arithmetic`__ | |
* `Half-precision Float Wikipedia Article`__. | |
* `OpenGL Half Float Pixel Support`__ | |
* `The OpenEXR image format`__. | |
__ http://ieeexplore.ieee.org/servlet/opac?punumber=4610933 | |
__ http://en.wikipedia.org/wiki/Half_precision_floating-point_format | |
__ http://www.opengl.org/registry/specs/ARB/half_float_pixel.txt | |
__ http://www.openexr.com/about.html | |
.. cvar:: NPY_HALF_ZERO | |
This macro is defined to positive zero. | |
.. cvar:: NPY_HALF_PZERO | |
This macro is defined to positive zero. | |
.. cvar:: NPY_HALF_NZERO | |
This macro is defined to negative zero. | |
.. cvar:: NPY_HALF_ONE | |
This macro is defined to 1.0. | |
.. cvar:: NPY_HALF_NEGONE | |
This macro is defined to -1.0. | |
.. cvar:: NPY_HALF_PINF | |
This macro is defined to +inf. | |
.. cvar:: NPY_HALF_NINF | |
This macro is defined to -inf. | |
.. cvar:: NPY_HALF_NAN | |
This macro is defined to a NaN value, guaranteed to have its sign bit unset. | |
.. cfunction:: float npy_half_to_float(npy_half h) | |
Converts a half-precision float to a single-precision float. | |
.. cfunction:: double npy_half_to_double(npy_half h) | |
Converts a half-precision float to a double-precision float. | |
.. cfunction:: npy_half npy_float_to_half(float f) | |
Converts a single-precision float to a half-precision float. The | |
value is rounded to the nearest representable half, with ties going | |
to the nearest even. If the value is too small or too big, the | |
system's floating point underflow or overflow bit will be set. | |
.. cfunction:: npy_half npy_double_to_half(double d) | |
Converts a double-precision float to a half-precision float. The | |
value is rounded to the nearest representable half, with ties going | |
to the nearest even. If the value is too small or too big, the | |
system's floating point underflow or overflow bit will be set. | |
.. cfunction:: int npy_half_eq(npy_half h1, npy_half h2) | |
Compares two half-precision floats (h1 == h2). | |
.. cfunction:: int npy_half_ne(npy_half h1, npy_half h2) | |
Compares two half-precision floats (h1 != h2). | |
.. cfunction:: int npy_half_le(npy_half h1, npy_half h2) | |
Compares two half-precision floats (h1 <= h2). | |
.. cfunction:: int npy_half_lt(npy_half h1, npy_half h2) | |
Compares two half-precision floats (h1 < h2). | |
.. cfunction:: int npy_half_ge(npy_half h1, npy_half h2) | |
Compares two half-precision floats (h1 >= h2). | |
.. cfunction:: int npy_half_gt(npy_half h1, npy_half h2) | |
Compares two half-precision floats (h1 > h2). | |
.. cfunction:: int npy_half_eq_nonan(npy_half h1, npy_half h2) | |
Compares two half-precision floats that are known to not be NaN (h1 == h2). If | |
a value is NaN, the result is undefined. | |
.. cfunction:: int npy_half_lt_nonan(npy_half h1, npy_half h2) | |
Compares two half-precision floats that are known to not be NaN (h1 < h2). If | |
a value is NaN, the result is undefined. | |
.. cfunction:: int npy_half_le_nonan(npy_half h1, npy_half h2) | |
Compares two half-precision floats that are known to not be NaN (h1 <= h2). If | |
a value is NaN, the result is undefined. | |
.. cfunction:: int npy_half_iszero(npy_half h) | |
Tests whether the half-precision float has a value equal to zero. This may be slightly | |
faster than calling npy_half_eq(h, NPY_ZERO). | |
.. cfunction:: int npy_half_isnan(npy_half h) | |
Tests whether the half-precision float is a NaN. | |
.. cfunction:: int npy_half_isinf(npy_half h) | |
Tests whether the half-precision float is plus or minus Inf. | |
.. cfunction:: int npy_half_isfinite(npy_half h) | |
Tests whether the half-precision float is finite (not NaN or Inf). | |
.. cfunction:: int npy_half_signbit(npy_half h) | |
Returns 1 is h is negative, 0 otherwise. | |
.. cfunction:: npy_half npy_half_copysign(npy_half x, npy_half y) | |
Returns the value of x with the sign bit copied from y. Works for any value, | |
including Inf and NaN. | |
.. cfunction:: npy_half npy_half_spacing(npy_half h) | |
This is the same for half-precision float as npy_spacing and npy_spacingf | |
described in the low-level floating point section. | |
.. cfunction:: npy_half npy_half_nextafter(npy_half x, npy_half y) | |
This is the same for half-precision float as npy_nextafter and npy_nextafterf | |
described in the low-level floating point section. | |
.. cfunction:: npy_uint16 npy_floatbits_to_halfbits(npy_uint32 f) | |
Low-level function which converts a 32-bit single-precision float, stored | |
as a uint32, into a 16-bit half-precision float. | |
.. cfunction:: npy_uint16 npy_doublebits_to_halfbits(npy_uint64 d) | |
Low-level function which converts a 64-bit double-precision float, stored | |
as a uint64, into a 16-bit half-precision float. | |
.. cfunction:: npy_uint32 npy_halfbits_to_floatbits(npy_uint16 h) | |
Low-level function which converts a 16-bit half-precision float | |
into a 32-bit single-precision float, stored as a uint32. | |
.. cfunction:: npy_uint64 npy_halfbits_to_doublebits(npy_uint16 h) | |
Low-level function which converts a 16-bit half-precision float | |
into a 64-bit double-precision float, stored as a uint64. | |