GMP Extension Library

Admin аватар

Предлагается небольшая надстройка над библиотекой GNU MP (см. прикрепленные файлы), написал я которую по причине отсутствия в стандартном наборе последней таких функций как возведение числа в произвольную степень, вычисление логарифмов и пр.

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

Заголовочный файл GMPEXT:

/*****************************************************************************
Copyright (C) 2010 Гришин Максим Леонидович (altmer@arts-union.ru)
          (C) 2010 Maxim L. Grishin  (altmer@arts-union.ru)
          Официальный сайт http://alibs.arts-union.ru

        Программное обеспечение (ПО) предоставляется "как есть" - без явной и
неявной гарантии. Авторы не несут никакой ответственности за любые убытки,
связанные с использованием данного ПО, вы используете его на свой страх и риск.
        Данное ПО не предназначено для использования в странах с патентной
системой разрешающей патентование алгоритмов или программ.
        Авторы разрешают свободное использование данного ПО всем желающим,
в том числе в коммерческих целях.
        На распространение измененных версий ПО накладываются следующие ограничения:
        1. Запрещается утверждать, что это вы написали оригинальный продукт;
        2. Измененные версии не должны выдаваться за оригинальный продукт;
        3. Вам запрещается менять или удалять данное уведомление из пакетов с исходными текстами.

*****************************************************************************/


#ifndef GMPEXT_HEADER_DEFINITON
#define GMPEXT_HEADER_DEFINITON "GMP Extension Library v.0.5"

#include "gmp.h"

//------------------------------------------------------------------------------
//генераторы констант...........................................................
//------------------------------------------------------------------------------
/*******************************************************************************
        Процедура вычисляет число Pi
        Использованна формула Бэйли — Боруэйна — Плаффа

        rop         -   переменная в которую будет записан результат
        precap      -   точность в !!!двоичных!!! знаках после запятой

        Ворзвращает число итераций затраченных на вычисления, <0 - код ошибки
*/

int mpx_gen_pi(mpf_t rop, unsigned int precap);

/*******************************************************************************
        Процедура вычисляет ln(2)

        rop         -   переменная в которую будет записан результат
        precap      -   точность в !!!двоичных!!! знаках после запятой

        Ворзвращает число итераций затраченных на вычисления, <0 - код ошибки
*/

int mpx_gen_ln2(mpf_t rop, unsigned int precap);

/*******************************************************************************
        Процедура вычисляет снование натурального логарифма - e

        rop         -   переменная в которую будет записан результат
        precap      -   точность в !!!двоичных!!! знаках после запятой

        Ворзвращает число итераций затраченных на вычисления, <0 - код ошибки
*/

int mpx_gen_e(mpf_t rop, unsigned int precap);

//------------------------------------------------------------------------------
//Вспомогательные процедуры.....................................................
//------------------------------------------------------------------------------

/*******************************************************************************
        Вычисляет значение экспоненты в двоичном базисе
        !!!При экспоненте не вмещающейся в тип int - результат непредсказуем!!!
*/

int mpx_get_2exp(const mpf_t op);

/*******************************************************************************
        Извлечение мантиссы
*/

void mpx_get_mantissa(mpz_t rop, const mpf_t op);

/*******************************************************************************
        Деление по модулю
        rop = op1 mod op2
*/

void mpx_fmod(mpf_t rop, const mpf_t op1, const mpf_t op2);

//------------------------------------------------------------------------------
//Математические процедуры......................................................
//------------------------------------------------------------------------------
/*******************************************************************************
        Вычисляет натуральный логарифм - измененный High precision (довольно быстрый алгоритм,
                        !!!но учитывайте константы, которые лучше готовить заранее,!!!
                        если конечно максимальная точность заранее известна)
                        !!! При экспоненте больше +/-0xfffffff результат неверный!!!

        rop     -       переменная в которую будет записан результат вычисления
        op      -       значение от которого берется логарифм
        ln2     -       предварительно просчитанное значение ln(2), если NULL - оно будет вычисленно
                        точность константы должна быть как минимум rop.prec*2,
                        иначе точность результата будет менее op.prec
        pi      -       предварительно просчитанное значение числа Pi, если NULL - оно будет вычисленно,
                        точность константы должна быть как минимум rop.prec*6,
                        иначе точность результата будет менее op.prec

        Ворзвращает число итераций затраченных на вычисления в том числе констант, <0 - код ошибки:
                -1      -       op<=0
*/

int mpx_ln(mpf_t rop, const mpf_t op, const mpf_t ln2=NULL, const mpf_t pi=NULL);

/*******************************************************************************
        Возводит |op1| в степень op2, с использованием ряда Тейлора для e^x.
                        !!!учитывайте константы, которые лучше готовить заранее,!!!
                        если конечно максимальная точность заранее известна)

        rop     -       переменная в которую будет записан результат вычисления
        op1     -       значение
        op2     -       показатель
        ln2     -       предварительно просчитанное значение ln(2), если NULL - оно будет вычисленно
                        точность константы по идее должна быть как минимум rop.prec*8,
                        иначе точность результата будет менее op.prec
        pi      -       предварительно просчитанное значение числа Pi, если NULL - оно будет вычисленно,
                        точность константы по идее должна быть как минимум rop.prec*24,
                        иначе точность результата будет менее op.prec

        Ворзвращает число итераций затраченных на вычисления в том числе констант, <0 - код ошибки:
                -1      -       переполнение
*/

int mpx_pow_abs(mpf_t rop, const mpf_t op1, const mpf_t op2, const mpf_t ln2=NULL, const mpf_t pi=NULL);

/*******************************************************************************
        Вычисляет sin от op с использованием ряда Тейлора

        rop     -       переменная в которую будет записан результат вычисления
        op      -       значение от которого вычисляется синус
        pi      -       предварительно просчитанное значение числа Pi, если NULL - оно будет вычисленно,
                        точность константы по идее должна быть как минимум rop.prec*2,
                        используется при слишком больших значениях op.

        Ворзвращает число итераций затраченных на вычисления в том числе констант, <0 - код ошибки
*/

int mpx_sin(mpf_t rop, const mpf_t op, const mpf_t pi=NULL);

/*******************************************************************************
        Вычисляет cos от op с использованием ряда Тейлора

        rop     -       переменная в которую будет записан результат вычисления
        op      -       значение от которого вычисляется косинус
        pi      -       предварительно просчитанное значение числа Pi, если NULL - оно будет вычисленно,
                        точность константы по идее должна быть как минимум rop.prec*2,
                        используется при слишком больших значениях op.

        Ворзвращает число итераций затраченных на вычисления в том числе констант, <0 - код ошибки
*/

int mpx_cos(mpf_t rop, const mpf_t op, const mpf_t pi=NULL);

#endif

Последнюю сборку GMP под Windows можно найти тут.

Прикрепленный файлРазмер
gmpext.h (76)11.04 кб
gmpext.cpp (87)14.19 кб