Spec-Zone.ru › NumPy 1.12

Библиотеки ядра NumPy

Новая версия с 1.3.0.

Начиная с numpy 1.3.0, мы работаем над разделением чистого C-кода («вычислительного») от зависящего от Python кода. Цель состоит в двух аспектах: сделать код чище и позволить повторное использование кода другими расширениями за пределами numpy (scipy и т.д.).

Библиотека математических функций ядра NumPy

Библиотека математических функций ядра NumPy (‘npymath’) является первым шагом в этом направлении. Эта библиотека содержит большинство функций математики C99, которые могут быть использованы на платформах, где C99 не очень хорошо поддерживается. Основные математические функции имеют тот же API, что и функции C99, за исключением префикса npy_.

Доступные функции определены в <numpy/npy_math.h> — обратитесь к этому заголовку в случае сомнений.

Классификация чисел с плавающей точкой

NPY_NAN

Эта макрокоманда определена для NaN (Not a Number), и гарантируется, что бит знака не установлен («положительное» NaN). Соответствующие макрокоманды одинарной и расширенной точности доступны с суффиксом F и L.

NPY_INFINITY

Эта макрокоманда определена для положительной бесконечности. Соответствующие макрокоманды одинарной и расширенной точности доступны с суффиксом F и L.

NPY_PZERO

Эта макрокоманда определена для положительного нуля. Соответствующие макрокоманды одинарной и расширенной точности доступны с суффиксом F и L.

NPY_NZERO

Эта макрокоманда определена для отрицательного нуля (то есть бит знака установлен). Соответствующие макрокоманды одинарной и расширенной точности доступны с суффиксом F и L.

int npy_isnan(x)

Это макрокоманда, эквивалентная C99 isnan: работает для одинарной, двойной и расширенной точности и возвращает ненулевое значение, если x — NaN.

int npy_isfinite(x)

Это макрокоманда, эквивалентная C99 isfinite: работает для одинарной, двойной и расширенной точности и возвращает ненулевое значение, если x не является NaN или бесконечностью.

int npy_isinf(x)

Это макрокоманда, эквивалентная C99 isinf: работает для одинарной, двойной и расширенной точности и возвращает ненулевое значение, если x бесконечен (положительный и отрицательный).

int npy_signbit(x)

Это макрокоманда, эквивалентная C99 signbit: работает для одинарной, двойной и расширенной точности и возвращает ненулевое значение, если у x установлен бит знака (то есть число отрицательное).

double npy_copysign(double x, double y)

Эта функция эквивалентна C99 copysign: возвращает x с тем же знаком, что и y. Работает для любых значений, включая inf и nan. Одинарная и расширенная точности доступны с суффиксом f и l.

Новая версия с 1.4.0.

Полезные математические константы

Следующие математические константы доступны в npy_math.h. Одинарная и расширенная точности также доступны путем добавления суффиксов F и L соответственно.

NPY_E

Основание натурального логарифма (e)

NPY_LOG2E

Логарифм по основанию 2 числа Эйлера (\frac{\ln(e)}{\ln(2)})

NPY_LOG10E

Логарифм по основанию 10 числа Эйлера (\frac{\ln(e)}{\ln(10)})

NPY_LOGE2

Натуральный логарифм 2 (\ln(2))

NPY_LOGE10

Натуральный логарифм 10 (\ln(10))

NPY_PI

Число пи (\pi)

NPY_PI_2

Число пи, деленное на 2 (\frac{\pi}{2})

NPY_PI_4

Число пи, деленное на 4 (\frac{\pi}{4})

NPY_1_PI

Обратная величина числа пи (\frac{1}{\pi})

NPY_2_PI

Две обратные величины числа пи (\frac{2}{\pi})

NPY_EULER
Постоянная Эйлера
\lim_{n\rightarrow\infty}({\sum_{k=1}^n{\frac{1}{k}}-\ln n})

Работа с числами с плавающей точкой низкого уровня

Это может быть полезно для точного сравнения чисел с плавающей точкой.

double npy_nextafter(double x, double y)

Эта функция эквивалентна C99 nextafter: возвращает следующее представимое значение с плавающей точкой от x в направлении y. Одинарная и расширенная точности доступны с суффиксом f и l.

Новая версия с 1.4.0.

double npy_spacing(double x)

Эта функция эквивалентна встроенной функции Fortran. Возвращает расстояние между x и следующим представимым значением с плавающей точкой от x, например, spacing(1) == eps. Для nan и +/- inf возвращает nan. Одинарная и расширенная точности доступны с суффиксом 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.

Функции комплексных чисел

Новая версия с 1.4.0.

Добавлены функции комплексных чисел по типу C99. Их можно использовать, если вы хотите реализовать переносимые C-расширения. Поскольку мы по-прежнему поддерживаем платформы без типа комплексных чисел C99, вам необходимо ограничиться синтаксисом, совместимым с C90, например:

/* a = 1 + 2i \*/
npy_complex a = npy_cpack(1, 2);
npy_complex b;

b = npy_log(a);

Связывание с библиотекой ядра математических функций в расширении

Новая версия с 1.4.0.

Чтобы использовать библиотеку ядра математических функций в собственном расширении, необходимо добавить опции компиляции и компоновки npymath к расширению в setup.py:

>>> 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 и т.д.

Функции половинной точности

Новая версия с 2.0.0.

Заголовочный файл <numpy/halffloat.h> предоставляет функции для работы с 16-битными значениями с плавающей точкой IEEE 754-2008. Хотя этот формат обычно не используется для численных вычислений, он полезен для хранения значений, требующих плавающей точки, но не требующих высокой точности. Его также можно использовать в качестве учебного инструмента для понимания природы ошибок округления с плавающей точкой.

Как и для других типов, NumPy включает typedef npy_half для 16-битного числа с плавающей точкой. В отличие от большинства других типов, вы не можете использовать его как обычный тип в C, так как это typedef для npy_uint16. Например, 1.0 выглядит как 0x3c00 для C, и если вы выполните сравнение на равенство между различными знаковыми нулями, вы получите -0.0 != 0.0 (0x8000 != 0x0000), что неверно.

По этим причинам NumPy предоставляет API для работы со значениями npy_half, доступными путем включения <numpy/halffloat.h> и компоновки с ‘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);
}

Ссылки на внешние ресурсы:

  • Стандарт IEEE 754-2008 для арифметики с плавающей точкой
  • Статья Википедии о формате чисел с плавающей точкой половинной точности.
  • Поддержка пикселей с половинной точностью OpenGL
  • Формат изображения OpenEXR.
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)

Преобразует число с плавающей запятой одинарной точности в число с плавающей запятой полуточной точности. Значение округляется до ближайшего представимого значения с полуточной точностью, при равенстве – до ближайшего чётного. Если значение слишком мало или слишком велико, устанавливаются системные биты денормализации или переполнения.

npy_half npy_double_to_half(double d)

Преобразует число с плавающей запятой двойной точности в число с плавающей запятой полуточной точности. Значение округляется до ближайшего представимого значения с полуточной точностью, при равенстве – до ближайшего чётного. Если значение слишком мало или слишком велико, устанавливаются системные биты денормализации или переполнения.

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 <= h2).

int npy_half_lt(npy_half h1, npy_half h2)

Сравнивает два числа с плавающей запятой полуточной точности (h1 < h2).

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 < h2). Если значение является NaN, результат неопределён.

int npy_half_le_nonan(npy_half h1, npy_half h2)

Сравнивает два числа с плавающей запятой полуточной точности, известные как не NaN (h1 <= h2). Если значение является 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)

Проверяет, является ли число с плавающей запятой полуточной точности плюс или минус бесконечность.

int npy_half_isfinite(npy_half h)

Проверяет, является ли число с плавающей запятой полуточной точности конечным (не NaN и не бесконечность).

int npy_half_signbit(npy_half h)

Возвращает 1, если h отрицательно, 0 в противном случае.

npy_half npy_half_copysign(npy_half x, npy_half y)

Возвращает значение x со знаком, скопированным из y. Работает для любых значений, включая 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)

Функция низкого уровня, преобразующая 32-битное число с плавающей запятой одинарной точности, хранящееся как uint32, в 16-битное число с плавающей запятой полуточной точности.

npy_uint16 npy_doublebits_to_halfbits(npy_uint64 d)

Функция низкого уровня, преобразующая 64-битное число с плавающей запятой двойной точности, хранящееся как uint64, в 16-битное число с плавающей запятой полуточной точности.

npy_uint32 npy_halfbits_to_floatbits(npy_uint16 h)

Функция низкого уровня, преобразующая 16-битное число с плавающей запятой полуточной точности в 32-битное число с плавающей запятой одинарной точности, хранящееся как uint32.

npy_uint64 npy_halfbits_to_doublebits(npy_uint16 h)

Функция низкого уровня, преобразующая 16-битное число с плавающей запятой полуточной точности в 64-битное число с плавающей запятой двойной точности, хранящееся как uint64.

© 2008–2017 NumPy Developers
Licensed under the NumPy License.
https://docs.scipy.org/doc/numpy-1.12.0/reference/c-api.coremath.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API