GCE-Math ( G eneralized C onstant E xpression Math) เป็นไลบรารี C++ แบบเทมเพลตที่ทำให้สามารถคำนวณเวลาคอมไพล์ของฟังก์ชันทางคณิตศาสตร์ได้
คุณสมบัติ:
constexpr
C++11 และเข้ากันได้กับ C++11/14/17/20gcem::
เหมือนกันกับไวยากรณ์มาตรฐาน 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-alike 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