LibMPU

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

LibMPU (Math Processor Unit Library) – библиотека на языке C для арифметических операций над целыми, вещественными и комплексными числами повышенной разрядности. Она является базовым вычислительным слоем проектов MCPU и предназначена для численных и научных программ, которым недостаточно стандартных машинных типов.

Overview

Арифметические функции LibMPU поддерживают разрядности до 65536 бит. Для тригонометрических функций текущий предел составляет 16384 бита. Публичный интерфейс предоставляет семейства целых, вещественных и комплексных объектов, а также функции преобразования между внутренними числовыми форматами и текстовым представлением.

Дополнительное описание внутренней модели, арифметических флагов и операций опубликовано в статье LibMPU (Большие числа).

Data Formats

Числовые объекты LibMPU хранятся как массивы байтов фиксированной длины. Публичный заголовок определяет именованные типы для стандартного набора разрядностей, например mpu_int256_t, mpu_real1024_t и mpu_complex4096_t.

Класс Определённые разрядности Размер объекта
Integer8, 16, 32, 64, 128, ... 655361 ... 8192 bytes
Real32, 64, 128, 256, ... 655364 ... 8192 bytes
Complex32, 64, 128, 256, ... 655368 ... 16384 bytes

Целые объекты могут интерпретироваться как signed или unsigned. Для signed‑значений используется дополнительный код. Размер комплексного объекта вдвое больше размера вещественного объекта той же заявленной разрядности, поскольку он содержит действительную и мнимую части.

Processor Model

Одна из характерных особенностей LibMPU – процессорная модель арифметики с флагами состояния. Например, iadd() формирует перенос, а iadc() продолжает сложение следующего регистра с учётом этого переноса. Аналогично isub() и isbb() реализуют цепочку заёма.

Такая организация позволяет строить составные вычисления поверх регистров LibMPU и использовать библиотеку как программный математический процессор, а не только как набор изолированных функций больших чисел.

Build

LibMPU использует GNU Autotools. Для Git‑дерева сначала выполняется bootstrap; release‑архив уже содержит сгенерированный configure и вспомогательные файлы. Штатный вариант установки на 64‑битной Slackware выглядит следующим образом:

$ git clone https://git.radix-linux.su/libs/libmpu.git libmpu
$ cd libmpu
$ ./bootstrap
$ cd ..
$ mkdir build
$ cd build
$ ../libmpu/configure \
    --prefix=/usr \
    --libdir=/usr/lib64 \
    --enable-static=no
$ make
# make install

Usage

Building an Application

Установленная библиотека предоставляет утилиту mpu-config, через которую приложение может получить необходимые compiler и linker flags. Типовая схема использует mpu-config cflags, mpu-config --ldflags и mpu-config --libs.

Real Number Example

Перед вычислениями создаётся контекст LibMPU. Следующий укороченный фрагмент из штатного README вычисляет atan2(1,1) с разрядностью 16384 бита и переводит результат в ASCII.

#include <libmpu.h>
#include <stdio.h>

int
main( void )
{
  mpu_real16384_t  r, d;
  __mpu_char8_t    text[6000];

  __mpu_init();

  ascii_to_real( r, "1.0", NB_R16384 );
  ascii_to_real( d, "1.0", NB_R16384 );
  r_atan2( r, r, d, NB_R16384 );
  real_to_ascii( text, r, _real_mant_digs( NB_R16384 ), 'E', 0, 0, NB_R16384 );

  printf( "%s\n", text );

  __mpu_free_context();
  return( 0 );
}

Sources and Releases

Текущий публичный выпуск: 1.0.25.