GCE-Math ( обобщенная математика константных выражений ) — это шаблонная библиотека C++, позволяющая вычислять математические функции во время компиляции.
Функции:
constexpr C++11 и совместима с C++11/14/17/20.gcem:: идентичен синтаксису стандартной библиотеки C++ ( std:: ).Автор : Кит О’Хара
Библиотека активно поддерживается и продолжает расширяться. Список возможностей включает в себя:
abs , max , min , pow , sqrt , inv_sqrt ,ceil , floor , round , trunc , fmod ,exp , expm1 , log , log1p , log2 , log10 и другие.cos , sin , tanacos , asin , atan , atan2cosh , sinh , tanh , acosh , asinh , atanhgcd , lcmfactorial , binomial_coefbeta , lbeta , lgamma , tgamma , lmgammaerf , erf_invincomplete_beta , incomplete_gammaincomplete_beta_inv , incomplete_gamma_invПолная документация доступна онлайн:
PDF-версия документации доступна здесь.
GCE-Math представляет собой библиотеку только заголовков и не требует каких-либо дополнительных библиотек или утилит (кроме компилятора, совместимого с C++11). Просто добавьте файлы заголовков в свой проект, используя:
# include " gcem.hpp "Вы можете установить GCE-Math с помощью менеджера пакетов Conda.
conda install -c conda-forge gcemВы также можете установить библиотеку из исходного кода с помощью CMake.
# clone gcem from GitHub
git clone https://github.com/kthohr/gcem ./gcem
# make a build directory
cd ./gcem
mkdir build
cd build
# generate Makefiles and install
cmake .. -DCMAKE_INSTALL_PREFIX=/gcem/install/location
make install Например, /gcem/install/location может быть /usr/local/ .
Существует два способа создания набора тестов. В Unix-подобных системах Makefile доступен в tests/ .
cd ./gcem/tests
make
./run_tests В CMake опция GCEM_BUILD_TESTS=1 генерирует необходимые файлы Makefile для создания набора тестов.
cd ./gcem
mkdir build
cd build
cmake ../ -DGCEM_BUILD_TESTS=1 -DCMAKE_INSTALL_PREFIX=/gcem/install/location
make gcem_tests
cd tests
./exp.testВы можете протестировать библиотеку онлайн, используя интерактивный блокнот Jupyter:
Функции GCE-Math записываются в виде шаблонов C++ со спецификаторами constexpr , формат которых может показаться запутанным пользователям, незнакомым с программированием на основе шаблонов.
Например, функция ошибок Гаусса ( erf ) определяется как:
template < typename T>
constexpr
return_t <T>
erf ( const T x) noexcept ; Набор внутренних шаблонных функций constexpr будет реализовывать расширение непрерывной дроби и возвращать значение типа return_t<T> . Тип вывода (« return_t<T> ») обычно определяется типом ввода, например, int , float , double , long double и т. д.; если T является целочисленным типом, выходные данные будут обновлены до return_t<T> = double , в противном случае return_t<T> = T . Для типов, не охваченных std::is_integral , следует использовать пересчеты.
Чтобы посчитать 10!:
# include " gcem.hpp "
int main ()
{
constexpr int x = 10 ;
constexpr int res = gcem::factorial (x);
return 0 ;
}Проверка ассемблерного кода, сгенерированного Clang 7.0.0:
push rbp
mov rbp , rsp
xor eax , eax
mov dword ptr [ rbp - 4 ], 0
mov dword ptr [ rbp - 8 ], 10
mov dword ptr [ rbp - 12 ], 3628800
pop rbp
retМы видим, что вызов функции заменен числовым значением (10! = 3628800).
Аналогично, чтобы вычислить логарифмическую гамма-функцию в точке:
# include " gcem.hpp "
int main ()
{
constexpr long double x = 1.5 ;
constexpr long double res = gcem::lgamma (x);
return 0 ;
}Код сборки:
.LCPI0_0:
.long 1069547520 # float 1 . 5
.LCPI0_1:
.quad - 622431863250842976 # x86_fp80 - 0 . 120782237635245222719
.short 49147
.zero 6
main: # @main
push rbp
mov rbp , rsp
xor eax , eax
mov dword ptr [ rbp - 4 ], 0
fld dword ptr [ rip + .LCPI0_0 ]
fstp tbyte ptr [ rbp - 32 ]
fld tbyte ptr [ rip + .LCPI0_1 ]
fstp tbyte ptr [ rbp - 48 ]
pop rbp
ret