GCE-Math ( G eneralized Constant Expression Math) ist eine C++-Bibliothek mit Vorlagen, die die Berechnung mathematischer Funktionen zur Kompilierungszeit ermöglicht.
Merkmale:
constexpr
Format geschrieben und mit C++11/14/17/20 kompatibel.gcem::
-Syntax ist identisch mit der der C++-Standardbibliothek ( std::
).Autor : Keith O'Hara
Die Bibliothek wird aktiv gepflegt und ständig erweitert. Eine Liste der Funktionen umfasst:
abs
, max
, min
, pow
, sqrt
, inv_sqrt
,ceil
, floor
, round
, trunc
, fmod
,exp
, expm1
, log
, log1p
, log2
, log10
und mehrcos
, sin
, tan
acos
, asin
, atan
, atan2
cosh
, sinh
, tanh
, acosh
, asinh
, atanh
gcd
, lcm
factorial
, binomial_coef
beta
, lbeta
, lgamma
, tgamma
, lmgamma
erf
, erf_inv
incomplete_beta
, incomplete_gamma
incomplete_beta_inv
, incomplete_gamma_inv
Die vollständige Dokumentation ist online verfügbar:
Eine PDF-Version der Dokumentation finden Sie hier.
GCE-Math ist eine reine Header-Bibliothek und erfordert keine zusätzlichen Bibliotheken oder Dienstprogramme (über einen C++11-kompatiblen Compiler hinaus). Fügen Sie einfach die Header-Dateien zu Ihrem Projekt hinzu, indem Sie Folgendes verwenden:
# include " gcem.hpp "
Sie können GCE-Math mit dem Conda-Paketmanager installieren.
conda install -c conda-forge gcem
Sie können die Bibliothek auch mit CMake aus dem Quellcode installieren.
# 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
Beispielsweise könnte /gcem/install/location
/usr/local/
lauten.
Es gibt zwei Möglichkeiten, die Testsuite zu erstellen. Auf Unix-ähnlichen Systemen ist ein Makefile unter tests/
verfügbar.
cd ./gcem/tests
make
./run_tests
Mit CMake generiert die Option GCEM_BUILD_TESTS=1
die notwendigen Makefiles zum Erstellen der Testsuite.
cd ./gcem
mkdir build
cd build
cmake ../ -DGCEM_BUILD_TESTS=1 -DCMAKE_INSTALL_PREFIX=/gcem/install/location
make gcem_tests
cd tests
./exp.test
Sie können die Bibliothek online mit einem interaktiven Jupyter-Notizbuch testen:
GCE-Math-Funktionen werden als C++-Vorlagen mit constexpr
Spezifizierern geschrieben, deren Format für Benutzer, die mit vorlagenbasierter Programmierung nicht vertraut sind, möglicherweise verwirrend erscheint.
Beispielsweise ist die Gaußsche Fehlerfunktion ( erf
) wie folgt definiert:
template < typename T>
constexpr
return_t <T>
erf ( const T x) noexcept ;
Eine Reihe interner constexpr
-Funktionen mit Vorlagen implementieren eine Kettenbrucherweiterung und geben einen Wert vom Typ return_t<T>
zurück. Der Ausgabetyp („ return_t<T>
“) wird im Allgemeinen durch den Eingabetyp bestimmt, z. B. int
, float
, double
, long double
usw.; Wenn T
ein ganzzahliger Typ ist, wird die Ausgabe auf return_t<T> = double
aktualisiert, andernfalls return_t<T> = T
. Für Typen, die nicht von std::is_integral
abgedeckt werden, sollten Neufassungen verwendet werden.
Um 10 zu berechnen:
# include " gcem.hpp "
int main ()
{
constexpr int x = 10 ;
constexpr int res = gcem::factorial (x);
return 0 ;
}
Untersuchen des von Clang 7.0.0 generierten Assemblercodes:
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
Wir sehen, dass ein Funktionsaufruf durch einen numerischen Wert (10! = 3628800) ersetzt wurde.
In ähnlicher Weise berechnen Sie die logarithmische Gammafunktion an einem Punkt:
# include " gcem.hpp "
int main ()
{
constexpr long double x = 1.5 ;
constexpr long double res = gcem::lgamma (x);
return 0 ;
}
Montagecode:
.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