NumPy core libraries

原文:https://docs.scipy.org/doc/numpy/reference/c-api.coremath.html

译者:飞龙 UsyiyiCN

校对:(虚位以待)

版本1.3.0中的新功能。

从numpy 1.3.0开始,我们正在努力将纯C,“计算”代码与python相关代码分离。目标是两个方面:使代码更清洁,并启用代码重用由numpy(scipy等)外的其他扩展。

NumPy core math library

numpy核心数学库('npymath')是这个方向的第一步。这个库包含大多数与数学相关的C99功能,可以在没有很好支持C99的平台上使用。核心数学函数具有与C99相同的API,除了npy_ *前缀。

The available functions are defined in - please refer to this header when in doubt.

Floating point classification

NPY_NAN

这个宏定义为NaN(不是数字),并且保证未设置signbit('positive'NaN)。相应的单精度宏和扩展精度宏可用后缀F和L.

NPY_INFINITY

此宏定义为正inf。相应的单精度宏和扩展精度宏可用后缀F和L.

NPY_PZERO

此宏定义为正零。相应的单精度宏和扩展精度宏可用后缀F和L.

NPY_NZERO

此宏定义为负零(即已设置符号位)。相应的单精度宏和扩展精度宏可用后缀F和L.

int npy_isnan(x)

这是一个宏,并且等价于C99 isnan:适用于单精度,双精度和扩展精度,并返回非0值,x是NaN。

int npy_isfinite(x)

这是一个宏,并且等效于C99 isfinite:适用于单精度,双精度和扩展精度,并返回非0值,x不是NaN也不是无穷大。

int npy_isinf(x)

这是一个宏,相当于C99 isinf:适用于单精度,双精度和扩展精度,返回一个非0值,x是无穷大(正和负)。

int npy_signbit(x)

这是一个宏,相当于C99 signbit:适用于单精度,双精度和扩展精度,并返回一个非0值,即x具有signbit集合(即数字为负)。

double npy_copysign(double x, double y)

这是一个等价于C99 copysign的函数:返回x与y相同的符号。适用于任何值,包括inf和nan。单和扩展精度可用后缀f和l。

版本1.4.0中的新功能。

Useful math constants

以下数学常数在npy_math.h中可用。还可以通过分别添加F和L后缀来获得单精度和扩展精度。

NPY_E

自然对数底(e

NPY_LOG2E

欧拉常数的基底2的对数(\frac{\ln(e)}{\ln(2)}

NPY_LOG10E

欧拉常数(\frac{\ln(e)}{\ln(10)})的以10为底的对数

NPY_LOGE2

2的自然对数(\ln(2)

NPY_LOGE10

10的自然对数(\ln(10)

NPY_PI

Pi(\pi

NPY_PI_2

Pi除以2(\frac{\pi}{2}

NPY_PI_4

Pi除以4(\frac{\pi}{4}

NPY_1_PI

p1(\frac{1}{\pi})的倒数

NPY_2_PI

两倍于pi的倒数(\frac{2}{\pi}

NPY_EULER
欧拉常数

Low-level floating point manipulation

这些可用于精确的浮点比较。

double npy_nextafter(double x, double y)

这是相当于C99 nextafter的函数:从y的方向返回下一个可表示的浮点值。单和扩展精度可用后缀f和l。

版本1.4.0中的新功能。

double npy_spacing(double x)

这是一个等价于Fortran本质的函数。从x返回x和下一个可表示浮点值之间的距离,例如spacing(1)== eps。纳米的间距和+/- inf返回纳米。单和扩展精度可用后缀f和l。

版本1.4.0中的新功能。

void npy_set_floatstatus_divbyzero()

设置除零浮点异常

版本1.6.0中的新功能。

void npy_set_floatstatus_overflow()

设置溢出浮点异常

版本1.6.0中的新功能。

void npy_set_floatstatus_underflow()

设置下溢浮点异常

版本1.6.0中的新功能。

void npy_set_floatstatus_invalid()

设置无效浮点异常

版本1.6.0中的新功能。

int npy_get_floatstatus()

获取浮点状态。返回具有以下可能标志的位掩码:

  • NPY_FPE_DIVIDEBYZERO
  • NPY_FPE_OVERFLOW
  • NPY_FPE_UNDERFLOW
  • NPY_FPE_INVALID

版本1.9.0中的新功能。

int npy_clear_floatstatus()

清除浮点状态。返回先前的状态掩码。

版本1.9.0中的新功能。

Complex functions

版本1.4.0中的新功能。

已添加C99-样复合物功能。如果你想实现便携式C扩展,那么可以使用。由于我们仍然支持没有C99复杂类型的平台,你需要限制为C90兼容语法,例如:

/* 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

版本1.4.0中的新功能。

要在您自己的扩展中使用核心数学库,您需要在setup.py中的扩展中添加npymath编译和链接选项:

>>> from numpy.distutils.misc_util import get_info
>>> info = get_info('npymath')
>>> config.add_extension('foo', sources=['foo.c'], extra_info=info)

换句话说,info的使用与使用blas_info和co时完全相同。

Half-precision functions

版本2.0.0中的新功能。

The header file provides functions to work with IEEE 754-2008 16-bit floating point values. 虽然此格式通常不用于数值计算,但它对于存储需要浮点但不需要很多精度的值很有用。它也可以用作一个教育工具来理解浮点舍入误差的性质。

像其他类型一样,NumPy包括16位浮点型的typedef npy_half。与大多数其他类型不同,你不能使用它作为C中的正常类型,因为is是npy_uint16的typedef。例如,1.0看起来像0x3c00到C,如果你做不同的有符号零之间的等式比较,你会得到-0.0!= 0.0(0x8000!= 0x0000),这是不正确的。

For these reasons, NumPy provides an API to work with npy_half values accessible by including and linking to ‘npymath’. 对于未直接提供的函数(如算术运算),首选方法是转换为float或double并再次返回,如以下示例所示。

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);
}

外部链接:

NPY_HALF_ZERO

此宏定义为正零。

NPY_HALF_PZERO

此宏定义为正零。

NPY_HALF_NZERO

此宏定义为负零。

NPY_HALF_ONE

此宏定义为1.0。

NPY_HALF_NEGONE

此宏定义为-1.0。

NPY_HALF_PINF

此宏定义为+ inf。

NPY_HALF_NINF

此宏定义为-inf。

NPY_HALF_NAN

此宏定义为NaN值,保证未设置其符号位。

float npy_half_to_float(npy_half h)

将半精度浮点数转换为单精度浮点数。

double npy_half_to_double(npy_half h)

将半精度浮点数转换为双精度浮点数。

npy_half npy_float_to_half(float f)

将单精度浮点数转换为半精度浮点数。该值四舍五入到最接近的可表示的一半,连接到最接近的偶数。如果值太小或太大,系统的浮点下溢或溢出位将被置1。

npy_half npy_double_to_half(double d)

将双精度浮点数转换为半精度浮点数。该值四舍五入到最接近的可表示的一半,连接到最接近的偶数。如果值太小或太大,系统的浮点下溢或溢出位将被置1。

int npy_half_eq(npy_half h1, npy_half h2)

比较两个半精度浮点数(h1 == h2)。

int npy_half_ne(npy_half h1, npy_half h2)

比较两个半精度浮点数(h1!= h2)。

int npy_half_le(npy_half h1, npy_half h2)

比较两个半精度浮点数(h1

int npy_half_lt(npy_half h1, npy_half h2)

比较两个半精度浮点数(h1

int npy_half_ge(npy_half h1, npy_half h2)

比较两个半精度浮点(h1> = h2)。

int npy_half_gt(npy_half h1, npy_half h2)

比较两个半精度浮点数(h1> h2)。

int npy_half_eq_nonan(npy_half h1, npy_half h2)

比较两个已知不是NaN(h1 == h2)的半精度浮点数。如果值为NaN,则结果未定义。

int npy_half_lt_nonan(npy_half h1, npy_half h2)

比较两个已知不是NaN的半精度浮点数(h1如果值为NaN,则结果未定义。

int npy_half_le_nonan(npy_half h1, npy_half h2)

比较两个已知不是NaN的半精度浮点数(h1如果值为NaN,则结果未定义。

int npy_half_iszero(npy_half h)

测试半精度浮点是否具有等于零的值。这可能比调用npy_half_eq(h,NPY_ZERO)稍快。

int npy_half_isnan(npy_half h)

测试半精度浮点是否为NaN。

int npy_half_isinf(npy_half h)

测试半精度浮点是加或减Inf。

int npy_half_isfinite(npy_half h)

测试半精度浮点是否是有限的(不是NaN或Inf)。

int npy_half_signbit(npy_half h)

返回1是h是负数,否则为0。

npy_half npy_half_copysign(npy_half x, npy_half y)

返回从y复制的符号位的x值。适用于任何值,包括Inf和NaN。

npy_half npy_half_spacing(npy_half h)

这与半精度浮点相同,如在低级浮点部分中描述的npy_spacing和npy_spacingf。

npy_half npy_half_nextafter(npy_half x, npy_half y)

这与半精度浮点相同,与低级浮点部分中描述的npy_nextafter和npy_nextafterf相同。

npy_uint16 npy_floatbits_to_halfbits(npy_uint32 f)

低级函数,将作为uint32存储的32位单精度浮点数转换为16位半精度浮点数。

npy_uint16 npy_doublebits_to_halfbits(npy_uint64 d)

低级函数,将64位双精度浮点数转换为16位半精度浮点数,存储为uint64。

npy_uint32 npy_halfbits_to_floatbits(npy_uint16 h)

低级函数,将16位半精度浮点数转换为32位单精度浮点数,存储为uint32。

npy_uint64 npy_halfbits_to_doublebits(npy_uint16 h)

低级函数,将16位半精度浮点数转换为64位双精度浮点数,存储为uint64。