Предлагается небольшая надстройка над библиотекой 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 можно найти тут.