1.3.0 新版功能.
从numpy 1.3.0开始,我们将致力于从依赖于Python的代码中分离纯C“计算”代码。目标有两个:使代码更干净,并允许numpy之外的其他扩展(scipy等)重用代码。
numpy核心数学库(“npymath”)是朝这个方向迈出的第一步。这个库包含大多数与数学相关的C99功能,可以在不支持C99的平台上使用。核心数学函数与C99函数具有相同的API,除了npy前缀。
可用函数在<numpy/npy_math.h>中定义-如果有疑问,请参阅此标题。
NPY_NAN
此宏定义为NaN(不是数字),并保证未设置符号位(“正”NaN)。相应的单精度宏和扩展精度宏的后缀为F和L。
NPY_INFINITY
此宏被定义为正INF。相应的单精度宏和扩展精度宏的后缀为F和L。
NPY_PZERO
此宏被定义为正零。相应的单精度和扩展精度宏有后缀f和l。
NPY_NZERO
此宏被定义为负零(即符号位集)。相应的单精度宏和扩展精度宏的后缀为F和L。
npy_isnan
这是一个宏,相当于c99 is nan:适用于单精度、双精度和扩展精度,返回的非0值是x是NaN。
npy_isfinite
这是一个宏,相当于c99是有限的:适用于单精度、双精度和扩展精度,返回的非0值是x既不是NaN也不是无穷大。
npy_isinf
这是一个宏,相当于c99 isif:适用于单精度、双精度和扩展精度,返回一个非0值x为无穷大(正和负)。
npy_signbit
这是一个宏,相当于c99符号位:适用于单精度、双精度和扩展精度,返回的非0值是x有符号位集(即数字为负数)。
npy_copysign
这是一个相当于c99 copysign:return x的函数,其符号与y相同。适用于任何值,包括inf和nan。单精度和扩展精度有后缀F和L。
1.4.0 新版功能.
以下数学常数可用于 npy_math.h . 单精度和扩展精度也可通过添加 f 和 l 后缀。
npy_math.h
f
l
NPY_E
自然对数底 ( )
NPY_LOG2E
以2为底的欧拉常数的对数 ( )
NPY_LOG10E
以10为底的欧拉常数的对数 ( )
NPY_LOGE2
2的自然对数 ( )
NPY_LOGE10
自然对数10 ( )
NPY_PI
圆周率 ( )
NPY_PI_2
PI除以2 ( )
NPY_PI_4
PI除以4 ( )
NPY_1_PI
π的倒数 ( )
NPY_2_PI
π倒数的两倍 ( )
NPY_EULER
这些对于精确的浮点比较很有用。
npy_nextafter
这是一个等价于c99 nextafter的函数:从x返回y方向上的下一个可表示的浮点值。单精度和扩展精度都有后缀f和l。
npy_spacing
这是一个等价于Fortran内部函数的函数。从x返回x和下一个可表示的浮点值之间的距离,例如间距(1)==eps。NAN和+/-INF返回NAN的间距。单精度和扩展精度有后缀F和L。
npy_set_floatstatus_divbyzero
设置除以零浮点异常
1.6.0 新版功能.
npy_set_floatstatus_overflow
设置溢出浮点异常
npy_set_floatstatus_underflow
设置下溢浮点异常
npy_set_floatstatus_invalid
设置无效的浮点异常
npy_get_floatstatus
获取浮点状态。返回具有以下可能标志的位掩码:
NPY_FPE_DIVIDEBYZERO
NPY_FPE_OVERFLOW
NPY_FPE_UNDERFLOW
NPY_FPE_INVALID
注意 npy_get_floatstatus_barrier 这是最好的,因为它可以防止激进的编译器优化相对于设置状态的代码重新排序调用,这可能会导致不正确的结果。
npy_get_floatstatus_barrier
1.9.0 新版功能.
获取浮点状态。传递一个指向局部变量的指针,以防止激进的编译器优化相对于设置状态的代码重新排序此函数调用,这可能导致不正确的结果。
返回具有以下可能标志的位掩码:
1.15.0 新版功能.
npy_clear_floatstatus
清除浮点状态。返回上一个状态掩码。
注意 npy_clear_floatstatus_barrier 这是最好的,因为它可以防止激进的编译器优化相对于设置状态的代码重新排序调用,这可能会导致不正确的结果。
npy_clear_floatstatus_barrier
清除浮点状态。传递一个指向局部变量的指针,以防止激进的编译器优化重新排序此函数调用。返回上一个状态掩码。
增加了类似C99的复杂函数。如果您希望实现可移植的C扩展,可以使用这些扩展。由于我们仍然支持没有c99复杂类型的平台,因此需要限制为c90兼容语法,例如:
/* a = 1 + 2i \*/ npy_complex a = npy_cpack(1, 2); npy_complex b; b = npy_log(a);
要在自己的扩展中使用核心数学库,需要在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)
换句话说,信息的用法与使用blas_info和co时完全相同。
头文件<numpy/halffloat.h>提供了使用IEEE754-2008 16位浮点值的函数。虽然这种格式通常不用于数值计算,但对于存储需要浮点但不需要太高精度的值很有用。它还可以作为一种教育工具来了解浮点舍入误差的性质。
与其他类型一样,numpy包含一个typedef npy_half,用于16位浮点。与大多数其他类型不同,在C中不能将其用作普通类型,因为它是npy uint16的typedef。例如,1.0看起来像0x3c00到c,如果在不同的有符号零之间进行相等比较,您将得到-0.0!= 0(0x8000!=0x0000),不正确。
出于这些原因,numpy提供了一个API,通过包含<numpy/halffloat.h>并链接到“npymath”来使用npy_half值。对于不直接提供的函数(如算术运算),首选方法是转换为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); }
外部链接:
754-2008 IEEE Standard for Floating-Point Arithmetic __
Half-precision Float Wikipedia Article __.
OpenGL Half Float Pixel Support __
The OpenEXR image format __.
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值,保证其符号位未设置。
npy_half_to_float
将半精度浮点转换为单精度浮点。
npy_half_to_double
将半精度浮点转换为双精度浮点。
npy_float_to_half
将单个精度浮点转换为半精度浮点。该值四舍五入到最接近的可表示的一半,而关系则转到最接近的偶数。如果值太小或太大,将设置系统的浮点下溢位或溢出位。
npy_double_to_half
将双精度浮点转换为半精度浮点。该值四舍五入到最接近的可表示的一半,而关系则转到最接近的偶数。如果值太小或太大,将设置系统的浮点下溢位或溢出位。
npy_half_eq
比较两个半精度浮点(h1==h2)。
npy_half_ne
比较两个半精度浮点(h1!= H2)。
npy_half_le
比较两个半精度浮点(h1<=h2)。
npy_half_lt
比较两个半精度浮点(h1<h2)。
npy_half_ge
比较两个半精度浮点(h1>=h2)。
npy_half_gt
比较两个半精度浮点(h1>h2)。
npy_half_eq_nonan
比较已知不是NaN(h1==h2)的两个半精度浮点。如果值为NaN,则结果未定义。
npy_half_lt_nonan
比较两个已知不是NaN(h1<h2)的半精度浮点。如果值为NaN,则结果未定义。
npy_half_le_nonan
比较已知不是NaN(h1<=h2)的两个半精度浮点。如果值为NaN,则结果未定义。
npy_half_iszero
测试半精度浮点值是否等于零。这可能比调用npy_half_eq(h,npy_zero)稍快。
npy_half_isnan
测试半精度浮点是否为NaN。
npy_half_isinf
测试半精度浮点是正负inf。
npy_half_isfinite
测试半精度浮点是否有限(非NaN或Inf)。
npy_half_signbit
返回1表示h为负,否则返回0。
npy_half_copysign
返回x的值,符号位从y复制。适用于任何值,包括inf和nan。
npy_half_spacing
对于半精度浮点,这与低级浮点部分中描述的npy_间距和npy_间距相同。
npy_half_nextafter
半精度浮点与低级浮点部分中描述的npy-nextafter和npy-nextafterf相同。
npy_floatbits_to_halfbits
将存储为uint32的32位单精度浮点转换为16位半精度浮点的低级函数。
npy_doublebits_to_halfbits
将一个64位双精度浮点(存储为uint64)转换为16位半精度浮点的低级函数。
npy_halfbits_to_floatbits
将16位半精度浮点转换为32位单精度浮点的低级函数,存储为uint32。
npy_halfbits_to_doublebits
将16位半精度浮点转换为64位双精度浮点的低级函数,存储为uint64。