GCE-Math ( G المعممة C onstant E xpression Math) هي مكتبة C++ مقولبة تتيح حساب وقت الترجمة للوظائف الرياضية.
سمات:
constexpr
، وهي متوافقة مع 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
، 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
الوثائق الكاملة متاحة على الانترنت:
نسخة 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
بإنشاء ملفات Makefiles الضرورية لإنشاء مجموعة الاختبار.
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