GCE-Math ( G eneralized C onstant Expression Math) é uma biblioteca C++ modelada que permite a computação em tempo de compilação de funções matemáticas.
Características:
constexpr C++ 11 e é compatível com C++ 11/14/17/20.gcem:: é idêntica à da biblioteca padrão C++ ( std:: ).Autor : Keith O'Hara
A biblioteca é mantida ativamente e ainda está sendo ampliada. Uma lista de recursos inclui:
abs , max , min , pow , sqrt , inv_sqrt ,ceil , floor , round , trunc , fmod ,exp , expm1 , log , log1p , log2 , log10 e maiscos , 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_invA documentação completa está disponível online:
Uma versão em PDF da documentação está disponível aqui.
GCE-Math é uma biblioteca somente de cabeçalho e não requer nenhuma biblioteca ou utilitário adicional (além de um compilador compatível com C++ 11). Basta adicionar os arquivos de cabeçalho ao seu projeto usando:
# include " gcem.hpp "Você pode instalar o GCE-Math usando o gerenciador de pacotes Conda.
conda install -c conda-forge gcemVocê também pode instalar a biblioteca do código-fonte usando 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 Por exemplo, /gcem/install/location poderia ser /usr/local/ .
Existem duas maneiras de construir o conjunto de testes. Em sistemas semelhantes ao Unix, um Makefile está disponível em tests/ .
cd ./gcem/tests
make
./run_tests Com CMake, a opção GCEM_BUILD_TESTS=1 gera os Makefiles necessários para construir o conjunto de testes.
cd ./gcem
mkdir build
cd build
cmake ../ -DGCEM_BUILD_TESTS=1 -DCMAKE_INSTALL_PREFIX=/gcem/install/location
make gcem_tests
cd tests
./exp.testVocê pode testar a biblioteca online usando um notebook Jupyter interativo:
As funções GCE-Math são escritas como modelos C++ com especificadores constexpr , cujo formato pode parecer confuso para usuários não familiarizados com programação baseada em modelos.
Por exemplo, a função de erro gaussiana ( erf ) é definida como:
template < typename T>
constexpr
return_t <T>
erf ( const T x) noexcept ; Um conjunto de funções constexpr de modelo interno implementará uma expansão de fração contínua e retornará um valor do tipo return_t<T> . O tipo de saída (' return_t<T> ') é geralmente determinado pelo tipo de entrada, por exemplo, int , float , double , long double , etc.; quando T é um tipo integral, a saída será atualizada para return_t<T> = double , caso contrário return_t<T> = T . Para tipos não cobertos por std::is_integral , reformulações devem ser usadas.
Para calcular 10!:
# include " gcem.hpp "
int main ()
{
constexpr int x = 10 ;
constexpr int res = gcem::factorial (x);
return 0 ;
}Inspecionando o código assembly gerado pelo 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
retVemos que uma chamada de função foi substituída por um valor numérico (10! = 3628800).
Da mesma forma, para calcular a função log Gamma em um ponto:
# include " gcem.hpp "
int main ()
{
constexpr long double x = 1.5 ;
constexpr long double res = gcem::lgamma (x);
return 0 ;
}Código de montagem:
.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