LibMPU (Math Processor Unit Library) – библиотека на языке C для арифметических операций над целыми, вещественными и комплексными числами повышенной разрядности. Она является базовым вычислительным слоем проектов MCPU и предназначена для численных и научных программ, которым недостаточно стандартных машинных типов.
Overview
Арифметические функции LibMPU поддерживают разрядности до 65536 бит. Для тригонометрических функций текущий предел составляет 16384 бита. Публичный интерфейс предоставляет семейства целых, вещественных и комплексных объектов, а также функции преобразования между внутренними числовыми форматами и текстовым представлением.
Дополнительное описание внутренней модели, арифметических флагов и операций опубликовано в статье LibMPU (Большие числа).
Data Formats
Числовые объекты LibMPU хранятся как массивы байтов фиксированной длины. Публичный заголовок определяет именованные типы для стандартного набора разрядностей, например mpu_int256_t, mpu_real1024_t и mpu_complex4096_t.
| Класс | Определённые разрядности | Размер объекта |
|---|---|---|
| Integer | 8, 16, 32, 64, 128, ... 65536 | 1 ... 8192 bytes |
| Real | 32, 64, 128, 256, ... 65536 | 4 ... 8192 bytes |
| Complex | 32, 64, 128, 256, ... 65536 | 8 ... 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.