Squashed 'third_party/allwpilib/' changes from f1a82828fe..ce550705d7

ce550705d7 [ntcore] Fix client "received unknown id -1" (#6186)
3989617bde [ntcore] NetworkTable::GetStruct: Add I template param (#6183)
f1836e1321 [fieldImages] Fix 2024 field json (#6179)
d05f179a9a [build] Fix running apriltagsvision Java example (#6173)
b1b03bed85 [wpilib] Update MotorControllerGroup deprecation message (#6171)
fa63fbf446 LICENSE.md: Bump year to 2024 (#6169)
4809f3d0fc [apriltag] Add 2024 AprilTag locations (#6168)
dd90965362 [wpiutil] Fix RawFrame.setInfo() NPE (#6167)
8659372d08 [fieldImages] Add 2024 field image (#6166)
a2e4d0b15d [docs] Fix docs for SysID routine (#6164)
0a46a3a618 [wpilib] Make ADXL345 default I2C address public (#6163)
7c26bc70ab [sysid] Load DataLog files directly for analysis (#6103)
f94e3d81b9 [docs] Fix SysId routine JavaDoc warnings (#6159)
6bed82a18e [wpilibc] Clean up C++ SysId routine (#6160)
4595f84719 [wpilib] Report LiveWindow-enabled-in-test (#6158)
707cb06105 [wpilib] Add SysIdRoutine logging utility and command factory (#6033)
3e40b9e5da [wpilib] Correct SmartDashboard usage reporting (#6157)
106518c3f8 [docs] Fix wpilibj JavaDoc warnings (#6154)
19cb2a8eb4 [wpilibj] Make class variables private to match C++ (#6153)
13f4460e00 [docs] Add missing docs to enum fields (NFC) (#6150)
4210f5635d [docs] Fix warnings about undocumented default constructors (#6151)
0f060afb55 [ntcore] Disable WebSocket fragmentation (#6149)
f29a7d2e50 [docs] Add missing JavaDocs (#6146)
6e58db398d [commands] Make Java fields private (#6148)
4ac0720385 [build] Clean up CMake files (#6141)
44db3e0ac0 [sysid] Make constexpr variables outside class scope inline (#6145)
73c7d87db7 [glass] NTStringChooser: Properly set retained (#6144)
25636b712f [build] Remove unnecessary native dependencies in wpilibjExamples (#6143)
01fb98baaa [docs] Add Missing JNI docs from C++ (NFC) (#6139)
5c424248c4 [wpilibj] Remove unused AnalogTriggerException (#6142)
c486972c55 [wpimath] Make ExponentialProfile.State mutable (#6138)
783acb9b72 [wpilibj] Store long preferences as integers (#6136)
99ab836894 [wpiutil] Add missing JavaDocs (NFC) (#6132)
ad0859a8c9 [docs] Add missing JavaDocs (#6125)
5579219716 [docs] Exclude quickbuf files and proto/struct packages from doclint (#6128)
98f06911c7 [sysid] Use eigenvector component instead of eigenvalue for fit quality check (#6131)
e1d49b975c [wpimath] Add LinearFilter reset() overload to initialize input and output buffers (#6133)
8a0bf2b7a4 [hal] Add CANAPITypes to java (#6121)
91d8837c11 [wpilib] Make protected fields in accelerometers/gyros private (#6134)
e7c9f27683 [wpilib] Add functional interface equivalents to MotorController (#6053)
8aca706217 [glass] Add type information to SmartDashboard menu (#6117)
7d3e4ddba9 [docs] Add warning about using user button to docs (NFC) (#6129)
ec3cb3dcba [build] Disable clang-tidy warning about test case names (#6127)
495585b25d [examples] Update april tag family to 36h11 (#6126)
f9aabc5ab2 [wpilib] Throw early when EventLoop is modified while running (#6115)
c16946c0ec [hal] Add CANJNI docs (NFC) (#6120)
b7f4eb2811 [doc] Update maven artifacts for units and apriltags (NFC) (#6123)
f419a62b38 [doc] Update maintainers.md (NFC) (#6124)
938bf45fd9 [wpiutil] Remove type param from ProtobufSerializable and StructSerializable (#6122)
c34debe012 [docs] Link to external OpenCV docs (#6119)
07183765de [hal] Fix formatting of HAL_ENUM enums (NFC) (#6114)
af46034b7f [wpilib] Document only first party controllers are guaranteed to have correct mapping (#6112)
636ef58d94 [hal] Properly error check readCANStreamSession (#6108)
cc631d2a69 [build] Fix generated source set location in the HAL (#6113)
09f76b32c2 [wpimath] Compile with UTF-8 encoding (#6111)
47c5fd8620 [sysid] Check data quality before OLS (#6110)
24a76be694 [hal] Add method to detect if the CAN Stream has overflowed (#6105)
9333951736 [hal] Allocate CANStreamMessage in JNI if null (#6107)
6a2d3c30a6 [wpiutil] Struct: Add info template parameter pack (#6086)
e07de37e64 [commands] Mark ParallelDeadlineGroup.setDeadline() final (#6102)
141241d2d6 [wpilib] Fix usage reporting for static classes (#6090)
f2c2bab7dc [sysid] Fix adjusted R² calculation (#6101)
5659038443 [wpiutil,cscore,apriltag] Fix RawFrame (#6098)
8aeee03626 [commands] Improve error message when composing commands twice in same composition (#6091)
55508706ff [wpiutil,cscore] Move VideoMode.PixelFormat to wpiutil (#6097)
ab78b930e9 [wpilib] ADIS16470: Add access to all 3 axes (#6074)
795d4be9fd [wpilib] Fix precision issue in Color round-and-clamp (#6100)
7aa9ad44b8 [commands] Deprecate C++ TransferOwnership() (#6095)
92c81d0791 [ci] Update pregenerate workflow to actions/checkout@v4 (#6094)
1ce617be07 [ci] Update artifact actions to v4 (#6092)
2441b57156 [wpilib] Add PWMSparkFlex MotorController (#6089)
21d1972d7a [wpiutil] DataLog: Ensure file is written on shutdown (#6087)
c29e8c66cf [wpiutil] DataLog: Fix UB in AppendImpl (#6088)
ab309e34ef [glass] Fix order of loading window settings (#6056)
22a322c9f3 [wpimath] Report error on negative PID gains (#6055)
1dba26c937 [wpilib] Add method to get breaker fault at a specific channel in PowerDistribution[Sticky]Faults (#5521)
ef1cb3f41e [commands] Fix compose-while-scheduled issue and test all compositions (#5581)
aeb1a4aa33 [wpiutil] Add serializable marker interfaces (#6060)
c1178d5add [wpilib] Add StadiaController and command wrapper (#6083)
4e4a468d4d [wpimath] Make feedforward classes throw exceptions for negative Kv or Ka (#6084)
d1793f077d [build] cmake: Add NO_WERROR option to disable -Werror (#6071)
43fb6e9f87 [glass] Add Profiled PID controller support & IZone Support (#5959)
bcef6c5398 [apriltag] Fix Java generation functions (#6063)
4059e0cd9f [hal,wpilib] Add function to control "Radio" LED (#6073)
0b2cfb3abc [dlt] Change datalogtool default folder to logs folder (#6079)
df5e439b0c [wpilib] PS4Controller: enable usage reporting (#6081)
0ff7478968 [cscore] Fix RawFrame class not being loaded in JNI (#6077)
6f23d32fe1 [wpilib] AddressableLED: Update warning about single driver (NFC) (#6069)
35a1c52788 [build] Upgrade quickbuf to 1.3.3 (#6072)
e4e2bafdb1 [sysid] Document timestamp units (#6065)
3d201c71f7 [ntcore] Fix overlapping subscriber handling (#6067)
f02984159f [glass] Check for null entries when updating struct/proto (#6059)
a004c9e05f [commands] SubsystemBase: allow setting name in constructor (#6052)
0b4c6a1546 [wpimath] Add more docs to SimulatedAnnealing (NFC) (#6054)
ab15dae887 [wpilib] ArcadeDrive: Fix max output handling (#6051)
9599c1f56f [hal] Add usage reporting ids from 2024v2 image (#6041)
f87c64af8a [wpimath] MecanumDriveWheelSpeeds: Fix desaturate() (#6040)
8798700cec [wpilibcExamples] Add inline specifier to constexpr constants (#6049)
85c9ae6eff [wpilib] Fix PS5 Controller mappings (#6050)
7c8b7a97ad [wpiutil] Zero out roborio system timestamp (#6042)
d9b504bc84 [wpilib] DataLogManager: Change sim location to logs subdir (#6039)
906b810136 [build] cmake: Fix ntcore generated header install (#6038)
56e5b404d1 Update to final 2024 V2 image (#6034)
8723ee5c39 [ntcore] Add cached topic property (#5494)
192a28af47 Fix JDK 21 warnings (#6028)
d40bdd70ba [build] Upgrade to spotbugs Gradle plugin 6.0.2 (#6027)
7bfadf32e5 [wpilibj] Joystick: make remainder of get axis methods final (#6024)
a770110438 [commands] CommandCompositionError: Include stacktrace of original composition (#5984)
54a55b8b53 [wpiutil,hal] Update image; init Rio Now() HMB with a FPGA session (#6016)
7d4e515a6b [wpimath] Simplify calculation of C for DARE precondition (#6022)
5200316c14 [ntcore] Update transmit period on topic add/remove (#6021)
ddf79a25d4 [wpiunits] Overload Measure.per(Time) to return Measure<Velocity> (#6018)
a71adef316 [wpiutil] Clean up circular_buffer iterator syntax (#6020)
39a0bf4b98 [examples] Call resetOdometry() when controller command is executed (#5905)
f5fc101fda [build] cmake: Export jars and clean up jar installs (#6014)
38bf024c96 [build] Update to Gradle 8.5 (#6007)
9d11544c18 [wpimath] Rotate traveling salesman solution so input and solution have same initial pose (#6015)
28deba20f5 [wpimath] Commit generated quickbuf Java files (#5994)
c2971c0bb3 [build] cmake: Export apriltag and wpimath (#6012)
41cfc961e4 gitattributes: Add linguist-generated locations (#6004)
14c3ade155 [wpimath] Struct cleanup (#6011)
90757b9e90 [wpilib] Make Color::HexString() constexpr (#5985)
2676b77873 Fix compilation issues that occur when building with bazel (#6008)
d32c10487c [examples] Update C++ examples to use CommandPtr (#5988)
9bc5fcf886 [build] cmake: Default WITH_JAVA_SOURCE to WITH_JAVA (#6005)
d431abba3b [upstream_utils] Fix GCEM namespace usage and add hypot(x, y, z) (#6002)
2bb1409b82 Clean up Java style (#5990)
66172ab288 Remove submodule (#6003)
e8f8c0ceb0 [upstream_utils] Update to latest Eigen HEAD (#5996)
890992a849 [hal] Commit generated usage reporting files (#5993)
a583ca01e1 [wpiutil] Change Struct to allow non-constexpr implementation (#5992)
ca272de400 [build] Fix Gradle compile_commands.json and clang-tidy warnings (#5977)
76ae090570 [wpiutil] type_traits: Add is_constexpr() (#5997)
5172ab8fd0 [commands] C++ CommandPtr: Prevent null initialization (#5991)
96914143ba [build] Bump native-utils to fix compile_commands.json (#5989)
464e6121ef [ci] Report failed status to Azure on failed tests (#2654)
5dad46cd45 [wpimath] Commit generated files (#5986)
54ab65a63a [ntcore] Commit generated files (#5962)
7ed900ae3a [wpilib] Add hex string constructor to Color and Color8Bit (#5063)
74b85b76a9 [wpimath] Make gcem call std functions if not constant-evaluated (#5983)
30816111db [wpimath] Fix TimeInterpolatableBuffer crash (#5972)
5cc923de33 [wpilib] DataLogManager: Use logs subdirectory on USB drives (#5975)
1144115da0 [commands] Add GetName to Subsystem, use in Scheduler tracer epochs (#5836)
ac7d726ac3 [wpimath] Add simulated annealing (#5961)
e09be72ee0 [wpimath] Remove unused SimpleMatrixUtils class (#5979)
0f9ebe92d9 [wpimath] Add generic circular buffer class to Java (#5969)
9fa28eb07a [ci] Bump actions/checkout to v4 (#5736)
ca684ac207 [hal] Add capability to read power distribution data as a stream (#4983)
51eecef2bd [wpimath] Optimize 2nd derivative of quintic splines (#3292)
4fcf0b25a1 [build] Apply a formatter for CMake files (#5973)
9b8011aa67 [build] Pin wpiformat version (#5982)
e00a0e84c1 [build] cmake: fix protobuf dependency finding for certain distributions (#5981)
23dd591394 [upstream_utils] Remove libuv patch that adjusts whitespace (#5976)
b0719942f0 [wpiutil] Timestamp: Report errors on Rio HMB init failure (#5974)
7bc89c4322 [wpilib] Update getAlliance() docs (NFC) (#5971)
841ea682d1 [upstream_utils] Upgrade to LLVM 17.0.5 (#5970)
a74db52dae [cameraserver] Add getVideo() pixelFormat overload (#5966)
a7eb422662 [build] Update native utils for new compile commands files (#5968)
544b231d4d [sysid] Add missing cassert include (#5967)
31cd015970 [wpimath] Add SysId doc links to LinearSystemId in C++ (NFC) (#5960)
9280054eab Revert "[build] Export wpimath protobuf symbols (#5952)"
2aba97c610 Export pb files from wpimath
c80b2d2017 [build] Export wpimath protobuf symbols (#5952)
3c0652c18a [cscore] Replace CS_PixelFormat with WPI_PixelFormat (#5954)
95716eb0cb [wpiunits] Documentation improvements (#5932)
423fd75fa8 [wpilib] Default LiveWindowEnabledInTest to false (#5950)
dfdea9c992 [wpimath] Make KalmanFilter variant for asymmetric updates (#5951)
ca81ced409 [wpiutil] Move RawFrame to wpiutil; add generation of RawFrame for AprilTags (#5923)
437cc91af5 [cscore] CvSink: Allow specifying output PixelFormat (#5943)
25b7dca46b [build] Remove CMake flat install option (#5944)
bb05e20247 [wpimath] Add protobuf/struct for trivial types (#5935)
35744a036e [wpimath] Move struct/proto classes to separate files (#5918)
80d7ad58ea [build] Declare platform launcher dependency explicitly (#5909)
f8d983b154 [ntcore] Protobuf/Struct: Use atomic_bool instead of atomic_flag (#5946)
4a44210ee3 [ntcore] NetworkTableInstance: Suppress unused lambda capture warning (#5947)
bdc8620d55 [upstream_utils] Fix fmt compilation errors on Windows (#5948)
0ca1e9b5f9 [wpimath] Add basic wpiunits support (#5821)
cc30824409 [ntcore] Increase client meta-topic decoding limit (#5934)
b1fad062f7 [wpilib] Use RKDP in DifferentialDrivetrainSim (#5931)
ead9ae5a69 [build] Add generateProto dependency to test and dev (#5933)
cfbff32185 [wpiutil] timestamp: Fix startup race on Rio (#5930)
7d90d0bcc3 [wpimath] Clean up StateSpaceUtil (#5891)
7755e45aac [build] Add generated protobuf headers to C++ test include path (#5926)
3985c031da [ntcore] ProtobufSubscriber: Fix typos (#5928)
7a87fe4b60 [ntcore] ProtobufSubscriber: Make mutex and msg mutable (#5927)
09f3ed6a5f [commands] Add static Trigger factories for robot mode changes (#5902)
79dd795bc0 [wpimath] Clean up VecBuilder and MatBuilder (#5906)
e117274a67 [wpilib] Change default Rio log dir from /home/lvuser to /home/lvuser/logs (#5899)
a8b80ca256 [upstream_utils] Update to libuv 1.47.0 (#5889)
b3a9c3e96b [build] Bump macOS deployment target to 12 (#5890)
0f8129677b [build] Distribute wpimath protobuf headers (#5925)
d105f9e3e9 [wpiutil] ProtobufBuffer: Fix buffer reallocation (#5924)
c5f2f6a0fb [fieldImages] Fix typo in field images artifact name (#5922)
c1a57e422a [commands] Clean up make_vector.h (#5917)
78ebc6e9ec [wpimath] change G to gearing in LinearSystemId factories (#5834)
9ada181866 [hal] DriverStation.h: Add stddef.h include (#5897)
95fa5ec72f [wpilibc,ntcoreffi] DataLogManager: join on Stop() call (#5910)
b6f2d3cc14 [build] Remove usage of Version.parse (#5911)
cc2cbeb04c [examples] Replace gyro rotation with poseEstimator rotation (#5900)
fa6b171e1c [wpiutil] Suppress protobuf warning false positives on GCC 13 (#5907)
d504639bbe [apriltag] Improve AprilTag docs (#5895)
3a1194be40 Replace static_cast<void>() with [[maybe_unused]] attribute (#5892)
70392cbbcb [build] cmake: Add protobuf dependency to wpiutil-config (#5886)
17c1bd5a83 [ntcore] Use json_fwd (#5881)
e69a9efeba [wpilibcExamples] Match array parameter bounds (#5880)
14dcd0d26f Use char instead of uint8_t for json::parse (#5877)
ec1d261984 [hal] Fix garbage data for match info before DS connection (#5879)
63dbf5c614 [wpiutil] MemoryBuffer: Fix normal read and file type check (#5875)
b2e7be9250 [ntcore] Only datalog meta-topics if specifically requested (#5873)
201a42a3cd [wpimath] Reorder TrapezoidProfile.calculate() arguments (#5874)
04a781b4d7 [apriltag] Add GetTags to C++ version of AprilTagFieldLayout (#5872)
87a8a1ced4 [docs] Exclude eigen and protobuf from doxygen (#5871)

git-subtree-dir: third_party/allwpilib
git-subtree-split: ce550705d7cdab117c0153a202973fc026a81274
Signed-off-by: Maxwell Henderson <mxwhenderson@gmail.com>
Change-Id: Ic8645d0551d62b411b0a816c493f0f33291896a1
diff --git a/upstream_utils/gcem_patches/0001-Call-std-functions-if-not-constant-evaluated.patch b/upstream_utils/gcem_patches/0001-Call-std-functions-if-not-constant-evaluated.patch
new file mode 100644
index 0000000..b7742f0
--- /dev/null
+++ b/upstream_utils/gcem_patches/0001-Call-std-functions-if-not-constant-evaluated.patch
@@ -0,0 +1,1933 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Tyler Veness <calcmogul@gmail.com>
+Date: Sun, 26 Nov 2023 18:09:12 -0800
+Subject: [PATCH 1/2] Call std functions if not constant-evaluated
+
+The subheaders now have namespace declarations so C++ standard library
+headers can be included in the global namespace. Doing otherwise can
+cause ambiguous declarations of cmath functions.
+---
+ include/gcem.hpp                              | 151 +++++++++---------
+ include/gcem_incl/abs.hpp                     |  12 ++
+ include/gcem_incl/acos.hpp                    |  12 ++
+ include/gcem_incl/acosh.hpp                   |  12 ++
+ include/gcem_incl/asin.hpp                    |  12 ++
+ include/gcem_incl/asinh.hpp                   |  11 ++
+ include/gcem_incl/atan.hpp                    |  12 ++
+ include/gcem_incl/atan2.hpp                   |  12 ++
+ include/gcem_incl/atanh.hpp                   |  12 ++
+ include/gcem_incl/beta.hpp                    |  16 ++
+ include/gcem_incl/binomial_coef.hpp           |   7 +-
+ include/gcem_incl/ceil.hpp                    |  12 ++
+ include/gcem_incl/copysign.hpp                |  12 ++
+ include/gcem_incl/cos.hpp                     |  12 ++
+ include/gcem_incl/cosh.hpp                    |  12 ++
+ include/gcem_incl/erf.hpp                     |  12 ++
+ include/gcem_incl/erf_inv.hpp                 |   4 +
+ include/gcem_incl/exp.hpp                     |  12 ++
+ include/gcem_incl/expm1.hpp                   |  12 ++
+ include/gcem_incl/factorial.hpp               |   5 +
+ include/gcem_incl/find_exponent.hpp           |   5 +
+ include/gcem_incl/find_fraction.hpp           |   5 +
+ include/gcem_incl/find_whole.hpp              |   5 +
+ include/gcem_incl/floor.hpp                   |  12 ++
+ include/gcem_incl/fmod.hpp                    |  12 ++
+ include/gcem_incl/gcd.hpp                     |   5 +
+ include/gcem_incl/hypot.hpp                   |  12 ++
+ include/gcem_incl/incomplete_beta.hpp         |   5 +
+ include/gcem_incl/incomplete_beta_inv.hpp     |   5 +
+ include/gcem_incl/incomplete_gamma.hpp        |   5 +
+ include/gcem_incl/incomplete_gamma_inv.hpp    |   5 +
+ include/gcem_incl/inv_sqrt.hpp                |   5 +
+ include/gcem_incl/is_even.hpp                 |   5 +
+ include/gcem_incl/is_finite.hpp               |   5 +
+ include/gcem_incl/is_inf.hpp                  |   5 +
+ include/gcem_incl/is_nan.hpp                  |   5 +
+ include/gcem_incl/is_odd.hpp                  |   5 +
+ include/gcem_incl/lbeta.hpp                   |   5 +
+ include/gcem_incl/lcm.hpp                     |   5 +
+ include/gcem_incl/lgamma.hpp                  |  12 ++
+ include/gcem_incl/lmgamma.hpp                 |   5 +
+ include/gcem_incl/log.hpp                     |  12 ++
+ include/gcem_incl/log10.hpp                   |  12 ++
+ include/gcem_incl/log1p.hpp                   |  12 ++
+ include/gcem_incl/log2.hpp                    |  12 ++
+ include/gcem_incl/log_binomial_coef.hpp       |   7 +-
+ include/gcem_incl/mantissa.hpp                |   5 +
+ include/gcem_incl/max.hpp                     |  12 ++
+ include/gcem_incl/min.hpp                     |  12 ++
+ include/gcem_incl/neg_zero.hpp                |   5 +
+ include/gcem_incl/pow.hpp                     |  12 ++
+ include/gcem_incl/pow_integral.hpp            |   5 +
+ .../quadrature/gauss_legendre_30.hpp          |   5 +
+ .../quadrature/gauss_legendre_50.hpp          |   5 +
+ include/gcem_incl/round.hpp                   |  12 ++
+ include/gcem_incl/sgn.hpp                     |   5 +
+ include/gcem_incl/signbit.hpp                 |  12 ++
+ include/gcem_incl/sin.hpp                     |  12 ++
+ include/gcem_incl/sinh.hpp                    |  12 ++
+ include/gcem_incl/sqrt.hpp                    |  12 ++
+ include/gcem_incl/tan.hpp                     |  12 ++
+ include/gcem_incl/tanh.hpp                    |  12 ++
+ include/gcem_incl/tgamma.hpp                  |  12 ++
+ include/gcem_incl/trunc.hpp                   |  12 ++
+ 64 files changed, 645 insertions(+), 79 deletions(-)
+
+diff --git a/include/gcem.hpp b/include/gcem.hpp
+index 650d05d894786b123aefbc6d88c93604164d56d2..8ea7b2a279ecf4dcf684a39ee7e96db84e61a421 100644
+--- a/include/gcem.hpp
++++ b/include/gcem.hpp
+@@ -23,82 +23,79 @@
+ 
+ #include "gcem_incl/gcem_options.hpp"
+ 
+-namespace gcem
+-{
+-    #include "gcem_incl/quadrature/gauss_legendre_50.hpp"
+-
+-    #include "gcem_incl/is_inf.hpp"
+-    #include "gcem_incl/is_nan.hpp"
+-    #include "gcem_incl/is_finite.hpp"
+-    
+-    #include "gcem_incl/signbit.hpp"
+-    #include "gcem_incl/copysign.hpp"
+-    #include "gcem_incl/neg_zero.hpp"
+-    #include "gcem_incl/sgn.hpp"
+-
+-    #include "gcem_incl/abs.hpp"
+-    #include "gcem_incl/ceil.hpp"
+-    #include "gcem_incl/floor.hpp"
+-    #include "gcem_incl/trunc.hpp"
+-    #include "gcem_incl/is_odd.hpp"
+-    #include "gcem_incl/is_even.hpp"
+-    #include "gcem_incl/max.hpp"
+-    #include "gcem_incl/min.hpp"
+-    #include "gcem_incl/sqrt.hpp"
+-    #include "gcem_incl/inv_sqrt.hpp"
+-    #include "gcem_incl/hypot.hpp"
+-
+-    #include "gcem_incl/find_exponent.hpp"
+-    #include "gcem_incl/find_fraction.hpp"
+-    #include "gcem_incl/find_whole.hpp"
+-    #include "gcem_incl/mantissa.hpp"
+-    #include "gcem_incl/round.hpp"
+-    #include "gcem_incl/fmod.hpp"
+-
+-    #include "gcem_incl/pow_integral.hpp"
+-    #include "gcem_incl/exp.hpp"
+-    #include "gcem_incl/expm1.hpp"
+-    #include "gcem_incl/log.hpp"
+-    #include "gcem_incl/log1p.hpp"
+-    #include "gcem_incl/log2.hpp"
+-    #include "gcem_incl/log10.hpp"
+-    #include "gcem_incl/pow.hpp"
+-
+-    #include "gcem_incl/gcd.hpp"
+-    #include "gcem_incl/lcm.hpp"
+-
+-    #include "gcem_incl/tan.hpp"
+-    #include "gcem_incl/cos.hpp"
+-    #include "gcem_incl/sin.hpp"
+-
+-    #include "gcem_incl/atan.hpp"
+-    #include "gcem_incl/atan2.hpp"
+-    #include "gcem_incl/acos.hpp"
+-    #include "gcem_incl/asin.hpp"
+-
+-    #include "gcem_incl/tanh.hpp"
+-    #include "gcem_incl/cosh.hpp"
+-    #include "gcem_incl/sinh.hpp"
+-
+-    #include "gcem_incl/atanh.hpp"
+-    #include "gcem_incl/acosh.hpp"
+-    #include "gcem_incl/asinh.hpp"
+-
+-    #include "gcem_incl/binomial_coef.hpp"
+-    #include "gcem_incl/lgamma.hpp"
+-    #include "gcem_incl/tgamma.hpp"
+-    #include "gcem_incl/factorial.hpp"
+-    #include "gcem_incl/lbeta.hpp"
+-    #include "gcem_incl/beta.hpp"
+-    #include "gcem_incl/lmgamma.hpp"
+-    #include "gcem_incl/log_binomial_coef.hpp"
+-
+-    #include "gcem_incl/erf.hpp"
+-    #include "gcem_incl/erf_inv.hpp"
+-    #include "gcem_incl/incomplete_beta.hpp"
+-    #include "gcem_incl/incomplete_beta_inv.hpp"
+-    #include "gcem_incl/incomplete_gamma.hpp"
+-    #include "gcem_incl/incomplete_gamma_inv.hpp"
+-}
++#include "gcem_incl/quadrature/gauss_legendre_50.hpp"
++
++#include "gcem_incl/is_inf.hpp"
++#include "gcem_incl/is_nan.hpp"
++#include "gcem_incl/is_finite.hpp"
++
++#include "gcem_incl/signbit.hpp"
++#include "gcem_incl/copysign.hpp"
++#include "gcem_incl/neg_zero.hpp"
++#include "gcem_incl/sgn.hpp"
++
++#include "gcem_incl/abs.hpp"
++#include "gcem_incl/ceil.hpp"
++#include "gcem_incl/floor.hpp"
++#include "gcem_incl/trunc.hpp"
++#include "gcem_incl/is_odd.hpp"
++#include "gcem_incl/is_even.hpp"
++#include "gcem_incl/max.hpp"
++#include "gcem_incl/min.hpp"
++#include "gcem_incl/sqrt.hpp"
++#include "gcem_incl/inv_sqrt.hpp"
++#include "gcem_incl/hypot.hpp"
++
++#include "gcem_incl/find_exponent.hpp"
++#include "gcem_incl/find_fraction.hpp"
++#include "gcem_incl/find_whole.hpp"
++#include "gcem_incl/mantissa.hpp"
++#include "gcem_incl/round.hpp"
++#include "gcem_incl/fmod.hpp"
++
++#include "gcem_incl/pow_integral.hpp"
++#include "gcem_incl/exp.hpp"
++#include "gcem_incl/expm1.hpp"
++#include "gcem_incl/log.hpp"
++#include "gcem_incl/log1p.hpp"
++#include "gcem_incl/log2.hpp"
++#include "gcem_incl/log10.hpp"
++#include "gcem_incl/pow.hpp"
++
++#include "gcem_incl/gcd.hpp"
++#include "gcem_incl/lcm.hpp"
++
++#include "gcem_incl/tan.hpp"
++#include "gcem_incl/cos.hpp"
++#include "gcem_incl/sin.hpp"
++
++#include "gcem_incl/atan.hpp"
++#include "gcem_incl/atan2.hpp"
++#include "gcem_incl/acos.hpp"
++#include "gcem_incl/asin.hpp"
++
++#include "gcem_incl/tanh.hpp"
++#include "gcem_incl/cosh.hpp"
++#include "gcem_incl/sinh.hpp"
++
++#include "gcem_incl/atanh.hpp"
++#include "gcem_incl/acosh.hpp"
++#include "gcem_incl/asinh.hpp"
++
++#include "gcem_incl/binomial_coef.hpp"
++#include "gcem_incl/lgamma.hpp"
++#include "gcem_incl/tgamma.hpp"
++#include "gcem_incl/factorial.hpp"
++#include "gcem_incl/lbeta.hpp"
++#include "gcem_incl/beta.hpp"
++#include "gcem_incl/lmgamma.hpp"
++#include "gcem_incl/log_binomial_coef.hpp"
++
++#include "gcem_incl/erf.hpp"
++#include "gcem_incl/erf_inv.hpp"
++#include "gcem_incl/incomplete_beta.hpp"
++#include "gcem_incl/incomplete_beta_inv.hpp"
++#include "gcem_incl/incomplete_gamma.hpp"
++#include "gcem_incl/incomplete_gamma_inv.hpp"
+ 
+ #endif
+diff --git a/include/gcem_incl/abs.hpp b/include/gcem_incl/abs.hpp
+index 6d7b66d91bc9f4d0c05fd0c3dd1571b552d8a19a..8e8330b198a206ea4f422d6782c66fe92bdd6522 100644
+--- a/include/gcem_incl/abs.hpp
++++ b/include/gcem_incl/abs.hpp
+@@ -21,6 +21,12 @@
+ #ifndef _gcem_abs_HPP
+ #define _gcem_abs_HPP
+ 
++#include <cmath>
++#include <type_traits>
++
++namespace gcem
++{
++
+ /**
+  * Compile-time absolute value function
+  *
+@@ -34,12 +40,18 @@ T
+ abs(const T x)
+ noexcept
+ {
++  if (std::is_constant_evaluated()) {
+     return( // deal with signed-zeros
+             x == T(0) ? \
+                 T(0) :
+             // else
+             x < T(0) ? \
+                 - x : x );
++  } else {
++    return std::abs(x);
++  }
++}
++
+ }
+ 
+ #endif
+diff --git a/include/gcem_incl/acos.hpp b/include/gcem_incl/acos.hpp
+index a47003d61d8ab2fb7dd0226410e1457809a73458..2e24d2acb61b5a5b647e707950cded8850b0ea66 100644
+--- a/include/gcem_incl/acos.hpp
++++ b/include/gcem_incl/acos.hpp
+@@ -25,6 +25,12 @@
+ #ifndef _gcem_acos_HPP
+ #define _gcem_acos_HPP
+ 
++#include <cmath>
++#include <type_traits>
++
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -78,7 +84,13 @@ return_t<T>
+ acos(const T x)
+ noexcept
+ {
++  if (std::is_constant_evaluated()) {
+     return internal::acos_check( static_cast<return_t<T>>(x) );
++  } else {
++    return std::acos(x);
++  }
++}
++
+ }
+ 
+ #endif
+diff --git a/include/gcem_incl/acosh.hpp b/include/gcem_incl/acosh.hpp
+index 8767200778168aeb409f16945b2ceac75b69158d..778c36cad6ebd849696aaa68d2697a5145a410a3 100644
+--- a/include/gcem_incl/acosh.hpp
++++ b/include/gcem_incl/acosh.hpp
+@@ -25,6 +25,12 @@
+ #ifndef _gcem_acosh_HPP
+ #define _gcem_acosh_HPP
+ 
++#include <cmath>
++#include <type_traits>
++
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -62,7 +68,13 @@ return_t<T>
+ acosh(const T x)
+ noexcept
+ {
++  if (std::is_constant_evaluated()) {
+     return internal::acosh_compute( static_cast<return_t<T>>(x) );
++  } else {
++    return std::acosh(x);
++  }
++}
++
+ }
+ 
+ #endif
+diff --git a/include/gcem_incl/asin.hpp b/include/gcem_incl/asin.hpp
+index 6a79e87df435c7e60b140b7c7133b22deea7fd73..39784aa10eb07ea9328ab819a1f396dd036719b4 100644
+--- a/include/gcem_incl/asin.hpp
++++ b/include/gcem_incl/asin.hpp
+@@ -25,6 +25,12 @@
+ #ifndef _gcem_asin_HPP
+ #define _gcem_asin_HPP
+ 
++#include <cmath>
++#include <type_traits>
++
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -76,7 +82,13 @@ return_t<T>
+ asin(const T x)
+ noexcept
+ {
++  if (std::is_constant_evaluated()) {
+     return internal::asin_check( static_cast<return_t<T>>(x) );
++  } else {
++    return std::asin(x);
++  }
++}
++
+ }
+ 
+ #endif
+diff --git a/include/gcem_incl/asinh.hpp b/include/gcem_incl/asinh.hpp
+index a5f3ff62a0208d350f4027d736ce3fc035c16ded..0a5969369a7a7856e41de1d891d571d5dd3c481f 100644
+--- a/include/gcem_incl/asinh.hpp
++++ b/include/gcem_incl/asinh.hpp
+@@ -25,6 +25,12 @@
+ #ifndef _gcem_asinh_HPP
+ #define _gcem_asinh_HPP
+ 
++#include <cmath>
++#include <type_traits>
++
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -59,8 +65,13 @@ return_t<T>
+ asinh(const T x)
+ noexcept
+ {
++  if (std::is_constant_evaluated()) {
+     return internal::asinh_compute( static_cast<return_t<T>>(x) );
++  } else {
++    return std::asinh(x);
++  }
+ }
+ 
++}
+ 
+ #endif
+diff --git a/include/gcem_incl/atan.hpp b/include/gcem_incl/atan.hpp
+index 3f46974c07920fca6396e42e93261d8167a27eb1..19b9d4e10d75b067527133060d3b07719f6cfb4c 100644
+--- a/include/gcem_incl/atan.hpp
++++ b/include/gcem_incl/atan.hpp
+@@ -29,6 +29,12 @@
+ #ifndef _gcem_atan_HPP
+ #define _gcem_atan_HPP
+ 
++#include <cmath>
++#include <type_traits>
++
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -149,7 +155,13 @@ return_t<T>
+ atan(const T x)
+ noexcept
+ {
++  if (std::is_constant_evaluated()) {
+     return internal::atan_check( static_cast<return_t<T>>(x) );
++  } else {
++    return std::atan(x);
++  }
++}
++
+ }
+ 
+ #endif
+diff --git a/include/gcem_incl/atan2.hpp b/include/gcem_incl/atan2.hpp
+index 5ca55b79c8e11569511fb6d4842c74be50c70c67..07a02cf4a2e134705b514a1031d1d7f47294bdf1 100644
+--- a/include/gcem_incl/atan2.hpp
++++ b/include/gcem_incl/atan2.hpp
+@@ -25,6 +25,12 @@
+ #ifndef _gcem_atan2_HPP
+ #define _gcem_atan2_HPP
+ 
++#include <cmath>
++#include <type_traits>
++
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -82,7 +88,13 @@ common_return_t<T1,T2>
+ atan2(const T1 y, const T2 x)
+ noexcept
+ {
++  if (std::is_constant_evaluated()) {
+     return internal::atan2_type_check(x,y);
++  } else {
++    return std::atan2(y, x);
++  }
++}
++
+ }
+ 
+ #endif
+diff --git a/include/gcem_incl/atanh.hpp b/include/gcem_incl/atanh.hpp
+index dfb4dc312d479e2c6dd837d2391bc658e3b678ed..5c4475bead1034c1b5b1583ad3050a85d380d629 100644
+--- a/include/gcem_incl/atanh.hpp
++++ b/include/gcem_incl/atanh.hpp
+@@ -25,6 +25,12 @@
+ #ifndef _gcem_atanh_HPP
+ #define _gcem_atanh_HPP
+ 
++#include <cmath>
++#include <type_traits>
++
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -73,7 +79,13 @@ return_t<T>
+ atanh(const T x)
+ noexcept
+ {
++  if (std::is_constant_evaluated()) {
+     return internal::atanh_check( static_cast<return_t<T>>(x) );
++  } else {
++    return std::atanh(x);
++  }
++}
++
+ }
+ 
+ #endif
+diff --git a/include/gcem_incl/beta.hpp b/include/gcem_incl/beta.hpp
+index e43d4fcd9a10e37e16652351ec7092cb7200f808..3439af1b57e0135eb1c53a15d14dbbbfbe57bc13 100644
+--- a/include/gcem_incl/beta.hpp
++++ b/include/gcem_incl/beta.hpp
+@@ -21,6 +21,12 @@
+ #ifndef _gcem_beta_HPP
+ #define _gcem_beta_HPP
+ 
++#include <cmath>
++#include <type_traits>
++
++namespace gcem
++{
++
+ /**
+  * Compile-time beta function
+  *
+@@ -36,7 +42,17 @@ common_return_t<T1,T2>
+ beta(const T1 a, const T2 b)
+ noexcept
+ {
++  if (std::is_constant_evaluated()) {
++    return exp( lbeta(a,b) );
++  } else {
++#ifdef __cpp_lib_math_special_functions
++    return std::beta(a, b);
++#else
+     return exp( lbeta(a,b) );
++#endif
++  }
++}
++
+ }
+ 
+ #endif
+diff --git a/include/gcem_incl/binomial_coef.hpp b/include/gcem_incl/binomial_coef.hpp
+index 0fc17f384d708b4bd81905d49b20f8037c4701ae..a1f764b97b78cbaf8fb66117dab374dc55f04d49 100644
+--- a/include/gcem_incl/binomial_coef.hpp
++++ b/include/gcem_incl/binomial_coef.hpp
+@@ -21,6 +21,9 @@
+ #ifndef _gcem_binomial_coef_HPP
+ #define _gcem_binomial_coef_HPP
+ 
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -88,4 +91,6 @@ noexcept
+     return internal::binomial_coef_type_check(n,k);
+ }
+ 
+-#endif
+\ No newline at end of file
++}
++
++#endif
+diff --git a/include/gcem_incl/ceil.hpp b/include/gcem_incl/ceil.hpp
+index ff1097bac2f53c3f6a4b3d4bfc612e0fcd34a63b..2611e6560bfefc4efe782849c88d74bc3ebf9d76 100644
+--- a/include/gcem_incl/ceil.hpp
++++ b/include/gcem_incl/ceil.hpp
+@@ -21,6 +21,12 @@
+ #ifndef _gcem_ceil_HPP
+ #define _gcem_ceil_HPP
+ 
++#include <cmath>
++#include <type_traits>
++
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -124,7 +130,13 @@ return_t<T>
+ ceil(const T x)
+ noexcept
+ {
++  if (std::is_constant_evaluated()) {
+     return internal::ceil_check( static_cast<return_t<T>>(x) );
++  } else {
++    return std::ceil(x);
++  }
++}
++
+ }
+ 
+ #endif
+diff --git a/include/gcem_incl/copysign.hpp b/include/gcem_incl/copysign.hpp
+index c1741f7f321110ff3cf52cb9035d5f2dca5f0ffc..d1181995c7d0fd92668c766f7fd9288c17312159 100644
+--- a/include/gcem_incl/copysign.hpp
++++ b/include/gcem_incl/copysign.hpp
+@@ -21,6 +21,12 @@
+ #ifndef _gcem_copysign_HPP
+ #define _gcem_copysign_HPP
+ 
++#include <cmath>
++#include <type_traits>
++
++namespace gcem
++{
++
+ /**
+  * Compile-time copy sign function
+  *
+@@ -35,7 +41,13 @@ T1
+ copysign(const T1 x, const T2 y)
+ noexcept
+ {
++  if (std::is_constant_evaluated()) {
+     return( signbit(x) != signbit(y) ? -x : x );
++  } else {
++    return std::copysign(x, y);
++  }
++}
++
+ }
+ 
+ #endif
+diff --git a/include/gcem_incl/cos.hpp b/include/gcem_incl/cos.hpp
+index 82f4c609f5268d19771e281987ed1653e81ef173..be73b55e3f2023538d33eedc78c9ed3e93014384 100644
+--- a/include/gcem_incl/cos.hpp
++++ b/include/gcem_incl/cos.hpp
+@@ -25,6 +25,12 @@
+ #ifndef _gcem_cos_HPP
+ #define _gcem_cos_HPP
+ 
++#include <cmath>
++#include <type_traits>
++
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -77,7 +83,13 @@ return_t<T>
+ cos(const T x)
+ noexcept
+ {
++  if (std::is_constant_evaluated()) {
+     return internal::cos_check( static_cast<return_t<T>>(x) );
++  } else {
++    return std::cos(x);
++  }
++}
++
+ }
+ 
+ #endif
+diff --git a/include/gcem_incl/cosh.hpp b/include/gcem_incl/cosh.hpp
+index fc89c0d06482a687442998da511eb1e7b17f95d5..53e5bb12641b4f13d43aee7a77c0d02bf845688a 100644
+--- a/include/gcem_incl/cosh.hpp
++++ b/include/gcem_incl/cosh.hpp
+@@ -25,6 +25,12 @@
+ #ifndef _gcem_cosh_HPP
+ #define _gcem_cosh_HPP
+ 
++#include <cmath>
++#include <type_traits>
++
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -59,7 +65,13 @@ return_t<T>
+ cosh(const T x)
+ noexcept
+ {
++  if (std::is_constant_evaluated()) {
+     return internal::cosh_compute( static_cast<return_t<T>>(x) );
++  } else {
++    return std::cosh(x);
++  }
++}
++
+ }
+ 
+ #endif
+diff --git a/include/gcem_incl/erf.hpp b/include/gcem_incl/erf.hpp
+index d0bc83ada14af7a4b50262541c8558016823303a..319669d7f0d0bfd0cd91e3bd94e9bbd0c92c66ea 100644
+--- a/include/gcem_incl/erf.hpp
++++ b/include/gcem_incl/erf.hpp
+@@ -25,6 +25,12 @@
+ #ifndef _gcem_erf_HPP
+ #define _gcem_erf_HPP
+ 
++#include <cmath>
++#include <type_traits>
++
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -137,7 +143,13 @@ return_t<T>
+ erf(const T x)
+ noexcept
+ {
++  if (std::is_constant_evaluated()) {
+     return internal::erf_check( static_cast<return_t<T>>(x) );
++  } else {
++    return std::erf(x);
++  }
++}
++
+ }
+ 
+ #endif
+diff --git a/include/gcem_incl/erf_inv.hpp b/include/gcem_incl/erf_inv.hpp
+index 412d686be268dd7668ca517e10e5e4be4263f0d7..c4f0d9d5abb46172fda7c6702bc31561f5680a37 100644
+--- a/include/gcem_incl/erf_inv.hpp
++++ b/include/gcem_incl/erf_inv.hpp
+@@ -28,6 +28,9 @@
+ #ifndef _gcem_erf_inv_HPP
+ #define _gcem_erf_inv_HPP
+ 
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -260,5 +263,6 @@ noexcept
+     return internal::erf_inv_begin( static_cast<return_t<T>>(p) );
+ }
+ 
++}
+ 
+ #endif
+diff --git a/include/gcem_incl/exp.hpp b/include/gcem_incl/exp.hpp
+index 595ffc2a6202d763560fd879f27fcef32c6b2d64..1708542df5153aeb6c2366078f32660ea002d51c 100644
+--- a/include/gcem_incl/exp.hpp
++++ b/include/gcem_incl/exp.hpp
+@@ -25,6 +25,12 @@
+ #ifndef _gcem_exp_HPP
+ #define _gcem_exp_HPP
+ 
++#include <cmath>
++#include <type_traits>
++
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -124,7 +130,13 @@ return_t<T>
+ exp(const T x)
+ noexcept
+ {
++  if (std::is_constant_evaluated()) {
+     return internal::exp_check( static_cast<return_t<T>>(x) );
++  } else {
++    return std::exp(x);
++  }
++}
++
+ }
+ 
+ #endif
+diff --git a/include/gcem_incl/expm1.hpp b/include/gcem_incl/expm1.hpp
+index 70c9ecf5a4a241bfef617e6e4ee0000a80978355..6adddc929aff7c87395a6b78070c65646ad61f2f 100644
+--- a/include/gcem_incl/expm1.hpp
++++ b/include/gcem_incl/expm1.hpp
+@@ -25,6 +25,12 @@
+ #ifndef _gcem_expm1_HPP
+ #define _gcem_expm1_HPP
+ 
++#include <cmath>
++#include <type_traits>
++
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -70,7 +76,13 @@ return_t<T>
+ expm1(const T x)
+ noexcept
+ {
++  if (std::is_constant_evaluated()) {
+     return internal::expm1_check( static_cast<return_t<T>>(x) );
++  } else {
++    return std::expm1(x);
++  }
++}
++
+ }
+ 
+ #endif
+diff --git a/include/gcem_incl/factorial.hpp b/include/gcem_incl/factorial.hpp
+index ffb9c824751a572c0982e11b9cddbe40cb567a3f..977e6970e4479ab39e65affbdd400827d29e7809 100644
+--- a/include/gcem_incl/factorial.hpp
++++ b/include/gcem_incl/factorial.hpp
+@@ -25,6 +25,9 @@
+ #ifndef _gcem_factorial_HPP
+ #define _gcem_factorial_HPP
+ 
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -95,4 +98,6 @@ noexcept
+     return internal::factorial_recur(x);
+ }
+ 
++}
++
+ #endif
+diff --git a/include/gcem_incl/find_exponent.hpp b/include/gcem_incl/find_exponent.hpp
+index 200e4e9be1558a61ed608be290bde5a6921363ea..4ffbcf294e61aa847d3e769e50ad9c3eddd8927a 100644
+--- a/include/gcem_incl/find_exponent.hpp
++++ b/include/gcem_incl/find_exponent.hpp
+@@ -25,6 +25,9 @@
+ #ifndef _gcem_find_exponent_HPP
+ #define _gcem_find_exponent_HPP
+ 
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -54,4 +57,6 @@ noexcept
+ 
+ }
+ 
++}
++
+ #endif
+diff --git a/include/gcem_incl/find_fraction.hpp b/include/gcem_incl/find_fraction.hpp
+index 5ed3d269ab54b3c90b3d681b76e8420e89e4527f..76893135383e5f6f5993d335c7b232114fdd90e3 100644
+--- a/include/gcem_incl/find_fraction.hpp
++++ b/include/gcem_incl/find_fraction.hpp
+@@ -25,6 +25,9 @@
+ #ifndef _gcem_find_fraction_HPP
+ #define _gcem_find_fraction_HPP
+ 
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -43,4 +46,6 @@ noexcept
+ 
+ }
+ 
++}
++
+ #endif
+diff --git a/include/gcem_incl/find_whole.hpp b/include/gcem_incl/find_whole.hpp
+index d19363219871803f8cfeafadb0a88189d2f98f0e..561050e91f9e43faf4d80fd08b7e63537b622422 100644
+--- a/include/gcem_incl/find_whole.hpp
++++ b/include/gcem_incl/find_whole.hpp
+@@ -25,6 +25,9 @@
+ #ifndef _gcem_find_whole_HPP
+ #define _gcem_find_whole_HPP
+ 
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -43,4 +46,6 @@ noexcept
+ 
+ }
+ 
++}
++
+ #endif
+diff --git a/include/gcem_incl/floor.hpp b/include/gcem_incl/floor.hpp
+index 8b260ff8a10fb8b9d048307c7d9b18a7e91900c1..3b3b86a12aa49e1c51957d170744a65690aeefdc 100644
+--- a/include/gcem_incl/floor.hpp
++++ b/include/gcem_incl/floor.hpp
+@@ -21,6 +21,12 @@
+ #ifndef _gcem_floor_HPP
+ #define _gcem_floor_HPP
+ 
++#include <cmath>
++#include <type_traits>
++
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -124,7 +130,13 @@ return_t<T>
+ floor(const T x)
+ noexcept
+ {
++  if (std::is_constant_evaluated()) {
+     return internal::floor_check( static_cast<return_t<T>>(x) );
++  } else {
++    return std::floor(x);
++  }
++}
++
+ }
+ 
+ #endif
+diff --git a/include/gcem_incl/fmod.hpp b/include/gcem_incl/fmod.hpp
+index 02459efd4b3a016939a306c9fd1a7ead12ff123b..58c454455edf132c078779ec15e254c96228b514 100644
+--- a/include/gcem_incl/fmod.hpp
++++ b/include/gcem_incl/fmod.hpp
+@@ -21,6 +21,12 @@
+ #ifndef _gcem_fmod_HPP
+ #define _gcem_fmod_HPP
+ 
++#include <cmath>
++#include <type_traits>
++
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -64,7 +70,13 @@ common_return_t<T1,T2>
+ fmod(const T1 x, const T2 y)
+ noexcept
+ {
++  if (std::is_constant_evaluated()) {
+     return internal::fmod_type_check(x,y);
++  } else {
++    return std::fmod(x, y);
++  }
++}
++
+ }
+ 
+ #endif
+diff --git a/include/gcem_incl/gcd.hpp b/include/gcem_incl/gcd.hpp
+index 1e277fbab61a06a20758f55d2c71ca57037f9d57..c5b14a22aafe7738dd14d120cab4dc6b31a5ad91 100644
+--- a/include/gcem_incl/gcd.hpp
++++ b/include/gcem_incl/gcd.hpp
+@@ -21,6 +21,9 @@
+ #ifndef _gcem_gcd_HPP
+ #define _gcem_gcd_HPP
+ 
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -79,4 +82,6 @@ noexcept
+     return internal::gcd_type_check(a,b);
+ }
+ 
++}
++
+ #endif
+diff --git a/include/gcem_incl/hypot.hpp b/include/gcem_incl/hypot.hpp
+index 01ad4e9212547c649113e50954a73ee9f7394334..00e10f899ace8f0da925fa9e46fa3f79f7e83aa0 100644
+--- a/include/gcem_incl/hypot.hpp
++++ b/include/gcem_incl/hypot.hpp
+@@ -27,6 +27,12 @@
+ #ifndef _gcem_hypot_HPP
+ #define _gcem_hypot_HPP
+ 
++#include <cmath>
++#include <type_traits>
++
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -84,7 +90,13 @@ common_return_t<T1,T2>
+ hypot(const T1 x, const T2 y)
+ noexcept
+ {
++  if (std::is_constant_evaluated()) {
+     return internal::hypot_type_check(x,y);
++  } else {
++    return std::hypot(x, y);
++  }
++}
++
+ }
+ 
+ #endif
+diff --git a/include/gcem_incl/incomplete_beta.hpp b/include/gcem_incl/incomplete_beta.hpp
+index dbb9f60341b09102b137de2b9ded75280a315d57..681cc59953f0f2b1bd3603216286edce06ce46cc 100644
+--- a/include/gcem_incl/incomplete_beta.hpp
++++ b/include/gcem_incl/incomplete_beta.hpp
+@@ -27,6 +27,9 @@
+ #ifndef _gcem_incomplete_beta_HPP
+ #define _gcem_incomplete_beta_HPP
+ 
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -191,4 +194,6 @@ noexcept
+     return internal::incomplete_beta_type_check(a,b,z);
+ }
+ 
++}
++
+ #endif
+diff --git a/include/gcem_incl/incomplete_beta_inv.hpp b/include/gcem_incl/incomplete_beta_inv.hpp
+index 9f575a360427d8b4ba9ebb940c2baf7ee242251c..3878d37db3bbef56e14bc053b9577b4f96c6c63c 100644
+--- a/include/gcem_incl/incomplete_beta_inv.hpp
++++ b/include/gcem_incl/incomplete_beta_inv.hpp
+@@ -25,6 +25,9 @@
+ #ifndef _gcem_incomplete_beta_inv_HPP
+ #define _gcem_incomplete_beta_inv_HPP
+ 
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -349,4 +352,6 @@ noexcept
+     return internal::incomplete_beta_inv_type_check(a,b,p);
+ }
+ 
++}
++
+ #endif
+diff --git a/include/gcem_incl/incomplete_gamma.hpp b/include/gcem_incl/incomplete_gamma.hpp
+index 9ee4146de0aacffee1f418bd91069c921e0a6a29..0432b7d3c6f75a726847c9d84d52e387df16f618 100644
+--- a/include/gcem_incl/incomplete_gamma.hpp
++++ b/include/gcem_incl/incomplete_gamma.hpp
+@@ -25,6 +25,9 @@
+ #ifndef _gcem_incomplete_gamma_HPP
+ #define _gcem_incomplete_gamma_HPP
+ 
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -244,4 +247,6 @@ noexcept
+     return internal::incomplete_gamma_type_check(a,x);
+ }
+ 
++}
++
+ #endif
+diff --git a/include/gcem_incl/incomplete_gamma_inv.hpp b/include/gcem_incl/incomplete_gamma_inv.hpp
+index e5976d08fddb5eb83ad40d200c5973d8ce2d6a36..6b1575b89c8e7284aee55882d12f1ee308d0cba3 100644
+--- a/include/gcem_incl/incomplete_gamma_inv.hpp
++++ b/include/gcem_incl/incomplete_gamma_inv.hpp
+@@ -25,6 +25,9 @@
+ #ifndef _gcem_incomplete_gamma_inv_HPP
+ #define _gcem_incomplete_gamma_inv_HPP
+ 
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -268,4 +271,6 @@ noexcept
+     return internal::incomplete_gamma_inv_type_check(a,p);
+ }
+ 
++}
++
+ #endif
+diff --git a/include/gcem_incl/inv_sqrt.hpp b/include/gcem_incl/inv_sqrt.hpp
+index d0e33fb743b09e7c72506599414f7a4e0e7e5058..466e76fc5e844ba4b3c6be1a6a2a5f20b4e3607f 100644
+--- a/include/gcem_incl/inv_sqrt.hpp
++++ b/include/gcem_incl/inv_sqrt.hpp
+@@ -25,6 +25,9 @@
+ #ifndef _gcem_inv_sqrt_HPP
+ #define _gcem_inv_sqrt_HPP
+ 
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -85,4 +88,6 @@ noexcept
+     return internal::inv_sqrt_check( static_cast<return_t<T>>(x) );
+ }
+ 
++}
++
+ #endif
+diff --git a/include/gcem_incl/is_even.hpp b/include/gcem_incl/is_even.hpp
+index de0641d85299a77380ba204e5e1d88538106468f..5aff6a3fa634d84b3fad6c831e3bb93797daee37 100644
+--- a/include/gcem_incl/is_even.hpp
++++ b/include/gcem_incl/is_even.hpp
+@@ -25,6 +25,9 @@
+ #ifndef _gcem_is_even_HPP
+ #define _gcem_is_even_HPP
+ 
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -38,4 +41,6 @@ noexcept
+ 
+ }
+ 
++}
++
+ #endif
+diff --git a/include/gcem_incl/is_finite.hpp b/include/gcem_incl/is_finite.hpp
+index b632fa34728ea66b595be68d48185474c3fe775e..805cbc4ab6708a51c95186801a1b0b02e0083e92 100644
+--- a/include/gcem_incl/is_finite.hpp
++++ b/include/gcem_incl/is_finite.hpp
+@@ -25,6 +25,9 @@
+ #ifndef _gcem_is_finite_HPP
+ #define _gcem_is_finite_HPP
+ 
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -75,4 +78,6 @@ noexcept
+ 
+ }
+ 
++}
++
+ #endif
+diff --git a/include/gcem_incl/is_inf.hpp b/include/gcem_incl/is_inf.hpp
+index 568614f8efa0e25fad4f87e1b71080849127378d..fdc31de71a3e73fda17216fb29e962c9f8a00958 100644
+--- a/include/gcem_incl/is_inf.hpp
++++ b/include/gcem_incl/is_inf.hpp
+@@ -25,6 +25,9 @@
+ #ifndef _gcem_is_inf_HPP
+ #define _gcem_is_inf_HPP
+ 
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -169,4 +172,6 @@ noexcept
+ 
+ }
+ 
++}
++
+ #endif
+diff --git a/include/gcem_incl/is_nan.hpp b/include/gcem_incl/is_nan.hpp
+index a3fcbc6c7cf6593965bee84b0eda0fc148f8f7ff..74092e6b087e47df45f70c6fcb5e62da53317f29 100644
+--- a/include/gcem_incl/is_nan.hpp
++++ b/include/gcem_incl/is_nan.hpp
+@@ -25,6 +25,9 @@
+ #ifndef _gcem_is_nan_HPP
+ #define _gcem_is_nan_HPP
+ 
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -77,4 +80,6 @@ noexcept
+ 
+ }
+ 
++}
++
+ #endif
+diff --git a/include/gcem_incl/is_odd.hpp b/include/gcem_incl/is_odd.hpp
+index a74a8d34f20da4a060b000b58fe7abd5b53f38b0..a76802f7ffc9b0faecae4f64c981ea76116e7c2a 100644
+--- a/include/gcem_incl/is_odd.hpp
++++ b/include/gcem_incl/is_odd.hpp
+@@ -25,6 +25,9 @@
+ #ifndef _gcem_is_odd_HPP
+ #define _gcem_is_odd_HPP
+ 
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -39,4 +42,6 @@ noexcept
+ 
+ }
+ 
++}
++
+ #endif
+diff --git a/include/gcem_incl/lbeta.hpp b/include/gcem_incl/lbeta.hpp
+index 60c87b4f53ec120121f1755635531dc4cc5ab26c..78f6849e72f56c35896e7e00ed9c3227a98114ba 100644
+--- a/include/gcem_incl/lbeta.hpp
++++ b/include/gcem_incl/lbeta.hpp
+@@ -21,6 +21,9 @@
+ #ifndef _gcem_lbeta_HPP
+ #define _gcem_lbeta_HPP
+ 
++namespace gcem
++{
++
+ /**
+  * Compile-time log-beta function
+  *
+@@ -39,4 +42,6 @@ noexcept
+     return( (lgamma(a) + lgamma(b)) - lgamma(a+b) );
+ }
+ 
++}
++
+ #endif
+diff --git a/include/gcem_incl/lcm.hpp b/include/gcem_incl/lcm.hpp
+index a7ca7766f8906c1d26c071146aba3543880d8dd9..aa1f3397309a8a4517fed63d954737e043e28d1b 100644
+--- a/include/gcem_incl/lcm.hpp
++++ b/include/gcem_incl/lcm.hpp
+@@ -21,6 +21,9 @@
+ #ifndef _gcem_lcm_HPP
+ #define _gcem_lcm_HPP
+ 
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -62,4 +65,6 @@ noexcept
+     return internal::lcm_type_check(a,b);
+ }
+ 
++}
++
+ #endif
+diff --git a/include/gcem_incl/lgamma.hpp b/include/gcem_incl/lgamma.hpp
+index 507c6d4c91423b31be55426f494f67b0cb085c9f..e349ee88dba2d23982a6d4485bc33da076c70e22 100644
+--- a/include/gcem_incl/lgamma.hpp
++++ b/include/gcem_incl/lgamma.hpp
+@@ -28,6 +28,12 @@
+ #ifndef _gcem_lgamma_HPP
+ #define _gcem_lgamma_HPP
+ 
++#include <cmath>
++#include <type_traits>
++
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -129,7 +135,13 @@ return_t<T>
+ lgamma(const T x)
+ noexcept
+ {
++  if (std::is_constant_evaluated()) {
+     return internal::lgamma_check( static_cast<return_t<T>>(x) );
++  } else {
++    return std::lgamma(x);
++  }
++}
++
+ }
+ 
+ #endif
+diff --git a/include/gcem_incl/lmgamma.hpp b/include/gcem_incl/lmgamma.hpp
+index 58915dc1e1a2edbbfdea58b57137cd22aaf4b717..b009de18e71c4360b55d0c1d80763f140190706f 100644
+--- a/include/gcem_incl/lmgamma.hpp
++++ b/include/gcem_incl/lmgamma.hpp
+@@ -25,6 +25,9 @@
+ #ifndef _gcem_lmgamma_HPP
+ #define _gcem_lmgamma_HPP
+ 
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -70,4 +73,6 @@ noexcept
+     return internal::lmgamma_recur(static_cast<return_t<T1>>(a),p);
+ }
+ 
++}
++
+ #endif
+diff --git a/include/gcem_incl/log.hpp b/include/gcem_incl/log.hpp
+index c2e24b006c2fdd01196b189220f35ca982d8bf9e..15577c8bacca3f4d0036997a2a34603ff56b4b24 100644
+--- a/include/gcem_incl/log.hpp
++++ b/include/gcem_incl/log.hpp
+@@ -25,6 +25,12 @@
+ #ifndef _gcem_log_HPP
+ #define _gcem_log_HPP
+ 
++#include <cmath>
++#include <type_traits>
++
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -180,7 +186,13 @@ return_t<T>
+ log(const T x)
+ noexcept
+ {
++  if (std::is_constant_evaluated()) {
+     return internal::log_integral_check( x );
++  } else {
++    return std::log(x);
++  }
++}
++
+ }
+ 
+ #endif
+diff --git a/include/gcem_incl/log10.hpp b/include/gcem_incl/log10.hpp
+index cda8894fdd62054f11ec4c3c3e6402c3752e0dd7..0e9a4dbdf58e2ed077e2f682706d98e71d794d67 100644
+--- a/include/gcem_incl/log10.hpp
++++ b/include/gcem_incl/log10.hpp
+@@ -25,6 +25,12 @@
+ #ifndef _gcem_log10_HPP
+ #define _gcem_log10_HPP
+ 
++#include <cmath>
++#include <type_traits>
++
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -53,7 +59,13 @@ return_t<T>
+ log10(const T x)
+ noexcept
+ {
++  if (std::is_constant_evaluated()) {
+     return internal::log10_check( x );
++  } else {
++    return std::log10(x);
++  }
++}
++
+ }
+ 
+ #endif
+diff --git a/include/gcem_incl/log1p.hpp b/include/gcem_incl/log1p.hpp
+index ccd08b8cb8799f2d4d34d5634dbc2fcabb3fd5b3..ed41daf39ec7e7062dc1da51ef0b0e106b56cf4e 100644
+--- a/include/gcem_incl/log1p.hpp
++++ b/include/gcem_incl/log1p.hpp
+@@ -25,6 +25,12 @@
+ #ifndef _gcem_log1p_HPP
+ #define _gcem_log1p_HPP
+ 
++#include <cmath>
++#include <type_traits>
++
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -74,7 +80,13 @@ return_t<T>
+ log1p(const T x)
+ noexcept
+ {
++  if (std::is_constant_evaluated()) {
+     return internal::log1p_check( static_cast<return_t<T>>(x) );
++  } else {
++    return std::log1p(x);
++  }
++}
++
+ }
+ 
+ #endif
+diff --git a/include/gcem_incl/log2.hpp b/include/gcem_incl/log2.hpp
+index a97fed4c7236f816fa07ac2494f243adbac6742b..f8dc729f4f08348b8cc046468f40cfc84f1c9cb2 100644
+--- a/include/gcem_incl/log2.hpp
++++ b/include/gcem_incl/log2.hpp
+@@ -25,6 +25,12 @@
+ #ifndef _gcem_log2_HPP
+ #define _gcem_log2_HPP
+ 
++#include <cmath>
++#include <type_traits>
++
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -53,7 +59,13 @@ return_t<T>
+ log2(const T x)
+ noexcept
+ {
++  if (std::is_constant_evaluated()) {
+     return internal::log2_check( x );
++  } else {
++    return std::log2(x);
++  }
++}
++
+ }
+ 
+ #endif
+diff --git a/include/gcem_incl/log_binomial_coef.hpp b/include/gcem_incl/log_binomial_coef.hpp
+index 2bcaadd8bc1c64744eb082955522339d48589aec..c4ba2fa3de9f4f77ac772d24c1432fc93cc51840 100644
+--- a/include/gcem_incl/log_binomial_coef.hpp
++++ b/include/gcem_incl/log_binomial_coef.hpp
+@@ -21,6 +21,9 @@
+ #ifndef _gcem_log_binomial_coef_HPP
+ #define _gcem_log_binomial_coef_HPP
+ 
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -62,4 +65,6 @@ noexcept
+     return internal::log_binomial_coef_type_check(n,k);
+ }
+ 
+-#endif
+\ No newline at end of file
++}
++
++#endif
+diff --git a/include/gcem_incl/mantissa.hpp b/include/gcem_incl/mantissa.hpp
+index af23ea21d247327fa224370544e5f4410eac214b..4c95110d627568577440e5e662e72fdeffd95ade 100644
+--- a/include/gcem_incl/mantissa.hpp
++++ b/include/gcem_incl/mantissa.hpp
+@@ -25,6 +25,9 @@
+ #ifndef _gcem_mantissa_HPP
+ #define _gcem_mantissa_HPP
+ 
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -44,4 +47,6 @@ noexcept
+ 
+ }
+ 
++}
++
+ #endif
+diff --git a/include/gcem_incl/max.hpp b/include/gcem_incl/max.hpp
+index ddc3e4e6caff1a781e662a3ded8909cb703729ab..9f3901b4b19eb35331cd22be16c5b3a1ab5f65d6 100644
+--- a/include/gcem_incl/max.hpp
++++ b/include/gcem_incl/max.hpp
+@@ -21,6 +21,12 @@
+ #ifndef _gcem_max_HPP
+ #define _gcem_max_HPP
+ 
++#include <cmath>
++#include <type_traits>
++
++namespace gcem
++{
++
+ /**
+  * Compile-time pairwise maximum function
+  *
+@@ -35,7 +41,13 @@ common_t<T1,T2>
+ max(const T1 x, const T2 y)
+ noexcept
+ {
++  if (std::is_constant_evaluated()) {
+     return( y < x ? x : y );
++  } else {
++    return std::max(x, y);
++  }
++}
++
+ }
+ 
+ #endif
+diff --git a/include/gcem_incl/min.hpp b/include/gcem_incl/min.hpp
+index 5ce70b38e6d243267a053ec33fae31e59f6a359f..a35bcf6e2cb65f8712b873d3ef2827aca2d4d0f0 100644
+--- a/include/gcem_incl/min.hpp
++++ b/include/gcem_incl/min.hpp
+@@ -21,6 +21,12 @@
+ #ifndef _gcem_min_HPP
+ #define _gcem_min_HPP
+ 
++#include <cmath>
++#include <type_traits>
++
++namespace gcem
++{
++
+ /**
+  * Compile-time pairwise minimum function
+  *
+@@ -35,7 +41,13 @@ common_t<T1,T2>
+ min(const T1 x, const T2 y)
+ noexcept
+ {
++  if (std::is_constant_evaluated()) {
+     return( y > x ? x : y );
++  } else {
++    return std::min(x, y);
++  }
++}
++
+ }
+ 
+ #endif
+diff --git a/include/gcem_incl/neg_zero.hpp b/include/gcem_incl/neg_zero.hpp
+index 79d24a4dd56f4c361774135bc9450c71a9f61627..90923035419d8b7a88ca46c9dcb3294f601312fb 100644
+--- a/include/gcem_incl/neg_zero.hpp
++++ b/include/gcem_incl/neg_zero.hpp
+@@ -22,6 +22,9 @@
+  * extract signbit for signed zeros
+  */
+ 
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -35,3 +38,5 @@ noexcept
+ }
+ 
+ }
++
++}
+diff --git a/include/gcem_incl/pow.hpp b/include/gcem_incl/pow.hpp
+index 3891edef0e8f1e7b64e8632f46e87fd39bdba162..372166d40644ec5403d9308b5325a36a78ad2589 100644
+--- a/include/gcem_incl/pow.hpp
++++ b/include/gcem_incl/pow.hpp
+@@ -25,6 +25,12 @@
+ #ifndef _gcem_pow_HPP
+ #define _gcem_pow_HPP
+ 
++#include <cmath>
++#include <type_traits>
++
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -76,7 +82,13 @@ common_t<T1,T2>
+ pow(const T1 base, const T2 exp_term)
+ noexcept
+ {
++  if (std::is_constant_evaluated()) {
+     return internal::pow_check(base,exp_term);
++  } else {
++    return std::pow(base, exp_term);
++  }
++}
++
+ }
+ 
+ #endif
+diff --git a/include/gcem_incl/pow_integral.hpp b/include/gcem_incl/pow_integral.hpp
+index 4e671557071e6377721f3ca721a7b5875f2ffd83..589d16406576bb637963aae33e40aeddf164079a 100644
+--- a/include/gcem_incl/pow_integral.hpp
++++ b/include/gcem_incl/pow_integral.hpp
+@@ -25,6 +25,9 @@
+ #ifndef _gcem_pow_integral_HPP
+ #define _gcem_pow_integral_HPP
+ 
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -125,4 +128,6 @@ noexcept
+ 
+ }
+ 
++}
++
+ #endif
+diff --git a/include/gcem_incl/quadrature/gauss_legendre_30.hpp b/include/gcem_incl/quadrature/gauss_legendre_30.hpp
+index 295f43d9522dcdd7cae358dfc5b6382cfa7bd782..a80d2bb6f9b0dbc9936f3ed3e4f3770b4c307b7d 100644
+--- a/include/gcem_incl/quadrature/gauss_legendre_30.hpp
++++ b/include/gcem_incl/quadrature/gauss_legendre_30.hpp
+@@ -22,6 +22,9 @@
+  * Gauss-Legendre quadrature: 30 points
+  */
+ 
++namespace gcem
++{
++
+ static const long double gauss_legendre_30_points[30] = \
+ {
+     -0.05147184255531769583302521316672L,
+@@ -89,3 +92,5 @@ static const long double gauss_legendre_30_weights[30] = \
+     0.00796819249616660561546588347467L,
+     0.00796819249616660561546588347467L\
+ };
++
++}
+diff --git a/include/gcem_incl/quadrature/gauss_legendre_50.hpp b/include/gcem_incl/quadrature/gauss_legendre_50.hpp
+index d4e448c56e923876f2f8627df4caa5d29eb1c501..85244daf1057aa2f07979a19765bcec3865950e2 100644
+--- a/include/gcem_incl/quadrature/gauss_legendre_50.hpp
++++ b/include/gcem_incl/quadrature/gauss_legendre_50.hpp
+@@ -22,6 +22,9 @@
+  * Gauss-Legendre quadrature: 50 points
+  */
+ 
++namespace gcem
++{
++
+ static const long double gauss_legendre_50_points[50] = \
+ {
+     -0.03109833832718887611232898966595L,
+@@ -129,3 +132,5 @@ static const long double gauss_legendre_50_weights[50] = \
+     0.00290862255315514095840072434286L,
+     0.00290862255315514095840072434286L\
+ };
++
++}
+diff --git a/include/gcem_incl/round.hpp b/include/gcem_incl/round.hpp
+index 9ac4a09f0a9e7b09a303795d30ccee32ebe841b1..10fae649f89b0320e4f38f87fa8f8ffb41d75b9f 100644
+--- a/include/gcem_incl/round.hpp
++++ b/include/gcem_incl/round.hpp
+@@ -21,6 +21,12 @@
+ #ifndef _gcem_round_HPP
+ #define _gcem_round_HPP
+ 
++#include <cmath>
++#include <type_traits>
++
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -119,7 +125,13 @@ return_t<T>
+ round(const T x)
+ noexcept
+ {
++  if (std::is_constant_evaluated()) {
+     return internal::round_check( static_cast<return_t<T>>(x) );
++  } else {
++    return std::round(x);
++  }
++}
++
+ }
+ 
+ #endif
+diff --git a/include/gcem_incl/sgn.hpp b/include/gcem_incl/sgn.hpp
+index e2eec9e80b57e73396f3cf7f335692d88dcd752b..4c4adfa5a8d9da0e04c55195ec596ce58f63c0a8 100644
+--- a/include/gcem_incl/sgn.hpp
++++ b/include/gcem_incl/sgn.hpp
+@@ -21,6 +21,9 @@
+ #ifndef _gcem_sgn_HPP
+ #define _gcem_sgn_HPP
+ 
++namespace gcem
++{
++
+ /**
+  * Compile-time sign function
+  *
+@@ -42,4 +45,6 @@ noexcept
+                 0 );
+ }
+ 
++}
++
+ #endif
+diff --git a/include/gcem_incl/signbit.hpp b/include/gcem_incl/signbit.hpp
+index 282e24403345dccfa8bf580112c129b43df5aa6d..40ec1dd157a687112f8258f76ea2ceb62d8ae22f 100644
+--- a/include/gcem_incl/signbit.hpp
++++ b/include/gcem_incl/signbit.hpp
+@@ -21,6 +21,12 @@
+ #ifndef _gcem_signbit_HPP
+ #define _gcem_signbit_HPP
+ 
++#include <cmath>
++#include <type_traits>
++
++namespace gcem
++{
++
+ /**
+  * Compile-time sign bit detection function
+  *
+@@ -34,11 +40,17 @@ bool
+ signbit(const T x)
+ noexcept
+ {
++  if (std::is_constant_evaluated()) {
+ #ifdef _MSC_VER
+     return( (x == T(0)) ? (_fpclass(x) == _FPCLASS_NZ) : (x < T(0)) );
+ #else
+     return GCEM_SIGNBIT(x);
+ #endif
++  } else {
++    return std::signbit(x);
++  }
++}
++
+ }
+ 
+ #endif
+diff --git a/include/gcem_incl/sin.hpp b/include/gcem_incl/sin.hpp
+index 56c8dcaf62dc22207ee7f41ec84d272e4535ab4e..c7c17600db0c8cb862c433183139d1f727fcea8b 100644
+--- a/include/gcem_incl/sin.hpp
++++ b/include/gcem_incl/sin.hpp
+@@ -27,6 +27,12 @@
+ #ifndef _gcem_sin_HPP
+ #define _gcem_sin_HPP
+ 
++#include <cmath>
++#include <type_traits>
++
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -79,7 +85,13 @@ return_t<T>
+ sin(const T x)
+ noexcept
+ {
++  if (std::is_constant_evaluated()) {
+     return internal::sin_check( static_cast<return_t<T>>(x) );
++  } else {
++    return std::sin(x);
++  }
++}
++
+ }
+ 
+ #endif
+diff --git a/include/gcem_incl/sinh.hpp b/include/gcem_incl/sinh.hpp
+index fe3ecdd0e719856c8bcc0e8d692d93c98c496942..9174d5d64a0622b56efac56fbfdc44994f78e78d 100644
+--- a/include/gcem_incl/sinh.hpp
++++ b/include/gcem_incl/sinh.hpp
+@@ -25,6 +25,12 @@
+ #ifndef _gcem_sinh_HPP
+ #define _gcem_sinh_HPP
+ 
++#include <cmath>
++#include <type_traits>
++
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -59,7 +65,13 @@ return_t<T>
+ sinh(const T x)
+ noexcept
+ {
++  if (std::is_constant_evaluated()) {
+     return internal::sinh_check( static_cast<return_t<T>>(x) );
++  } else {
++    return std::sinh(x);
++  }
++}
++
+ }
+ 
+ #endif
+diff --git a/include/gcem_incl/sqrt.hpp b/include/gcem_incl/sqrt.hpp
+index 1b2753c99ede5189fc2272080828c83ca63a184c..201d89fa0df5680ceb53ec3aabb20213b4326325 100644
+--- a/include/gcem_incl/sqrt.hpp
++++ b/include/gcem_incl/sqrt.hpp
+@@ -25,6 +25,12 @@
+ #ifndef _gcem_sqrt_HPP
+ #define _gcem_sqrt_HPP
+ 
++#include <cmath>
++#include <type_traits>
++
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -103,7 +109,13 @@ return_t<T>
+ sqrt(const T x)
+ noexcept
+ {
++  if (std::is_constant_evaluated()) {
+     return internal::sqrt_check( static_cast<return_t<T>>(x) );
++  } else {
++    return std::sqrt(x);
++  }
++}
++
+ }
+ 
+ #endif
+diff --git a/include/gcem_incl/tan.hpp b/include/gcem_incl/tan.hpp
+index 386cce0f412107f65183031b3458455059f55d54..08c12d4ea07ee06d1bd25bfd7cea2c3204a72e6c 100644
+--- a/include/gcem_incl/tan.hpp
++++ b/include/gcem_incl/tan.hpp
+@@ -25,6 +25,12 @@
+ #ifndef _gcem_tan_HPP
+ #define _gcem_tan_HPP
+ 
++#include <cmath>
++#include <type_traits>
++
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -134,7 +140,13 @@ return_t<T>
+ tan(const T x)
+ noexcept
+ {
++  if (std::is_constant_evaluated()) {
+     return internal::tan_check( static_cast<return_t<T>>(x) );
++  } else {
++    return std::tan(x);
++  }
++}
++
+ }
+ 
+ #endif
+diff --git a/include/gcem_incl/tanh.hpp b/include/gcem_incl/tanh.hpp
+index 30b431886601ec9f77ca9a93a6ca62b3cabd9e57..f25dabdb0f075d5597530cb9c1c41d0ba02e3783 100644
+--- a/include/gcem_incl/tanh.hpp
++++ b/include/gcem_incl/tanh.hpp
+@@ -25,6 +25,12 @@
+ #ifndef _gcem_tanh_HPP
+ #define _gcem_tanh_HPP
+ 
++#include <cmath>
++#include <type_traits>
++
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -83,7 +89,13 @@ return_t<T>
+ tanh(const T x)
+ noexcept
+ {
++  if (std::is_constant_evaluated()) {
+     return internal::tanh_check( static_cast<return_t<T>>(x) );
++  } else {
++    return std::tanh(x);
++  }
++}
++
+ }
+ 
+ #endif
+diff --git a/include/gcem_incl/tgamma.hpp b/include/gcem_incl/tgamma.hpp
+index deffd3a8e77c34a9ebfd5209ee32594dc5b241e2..1d9fceecf8f9e062f2f1fa6080091b64cf533849 100644
+--- a/include/gcem_incl/tgamma.hpp
++++ b/include/gcem_incl/tgamma.hpp
+@@ -25,6 +25,12 @@
+ #ifndef _gcem_tgamma_HPP
+ #define _gcem_tgamma_HPP
+ 
++#include <cmath>
++#include <type_traits>
++
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -74,7 +80,13 @@ return_t<T>
+ tgamma(const T x)
+ noexcept
+ {
++  if (std::is_constant_evaluated()) {
+     return internal::tgamma_check( static_cast<return_t<T>>(x) );
++  } else {
++    return std::tgamma(x);
++  }
++}
++
+ }
+ 
+ #endif
+diff --git a/include/gcem_incl/trunc.hpp b/include/gcem_incl/trunc.hpp
+index af3f448915f0f9a1b5f2d843596331f7874a6da5..f7a31ce7271339626127d6ca80dfb936fe53cc03 100644
+--- a/include/gcem_incl/trunc.hpp
++++ b/include/gcem_incl/trunc.hpp
+@@ -21,6 +21,12 @@
+ #ifndef _gcem_trunc_HPP
+ #define _gcem_trunc_HPP
+ 
++#include <cmath>
++#include <type_traits>
++
++namespace gcem
++{
++
+ namespace internal
+ {
+ 
+@@ -115,7 +121,13 @@ return_t<T>
+ trunc(const T x)
+ noexcept
+ {
++  if (std::is_constant_evaluated()) {
+     return internal::trunc_check( static_cast<return_t<T>>(x) );
++  } else {
++    return std::trunc(x);
++  }
++}
++
+ }
+ 
+ #endif
diff --git a/upstream_utils/gcem_patches/0002-Add-hypot-x-y-z.patch b/upstream_utils/gcem_patches/0002-Add-hypot-x-y-z.patch
new file mode 100644
index 0000000..4757239
--- /dev/null
+++ b/upstream_utils/gcem_patches/0002-Add-hypot-x-y-z.patch
@@ -0,0 +1,135 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Tyler Veness <calcmogul@gmail.com>
+Date: Sun, 3 Dec 2023 14:03:58 -0800
+Subject: [PATCH 2/2] Add hypot(x, y, z)
+
+---
+ include/gcem_incl/hypot.hpp | 85 +++++++++++++++++++++++++++++++++++--
+ 1 file changed, 82 insertions(+), 3 deletions(-)
+
+diff --git a/include/gcem_incl/hypot.hpp b/include/gcem_incl/hypot.hpp
+index 00e10f899ace8f0da925fa9e46fa3f79f7e83aa0..13ea80c49d374c23434c1f9859bb6474184dc420 100644
+--- a/include/gcem_incl/hypot.hpp
++++ b/include/gcem_incl/hypot.hpp
+@@ -27,6 +27,7 @@
+ #ifndef _gcem_hypot_HPP
+ #define _gcem_hypot_HPP
+ 
++#include <algorithm>
+ #include <cmath>
+ #include <type_traits>
+ 
+@@ -39,10 +40,29 @@ namespace internal
+ template<typename T>
+ constexpr
+ T
+-hypot_compute(const T x, const T ydx)
++hypot_compute(const T x, const T y)
+ noexcept
+ {
+-    return abs(x) * sqrt( T(1) + (ydx * ydx) );
++    T a = std::max(abs(x), abs(y));
++    if (a) {
++      return a * sqrt((x / a) * (x / a) + (y / a) * (y / a));
++    } else {
++      return {};
++    }
++}
++
++template<typename T>
++constexpr
++T
++hypot_compute(const T x, const T y, const T z)
++noexcept
++{
++    T a = std::max({abs(x), abs(y), abs(z)});
++    if (a) {
++      return a * sqrt((x / a) * (x / a) + (y / a) * (y / a) + (z / a) * (z / a));
++    } else {
++      return {};
++    }
+ }
+ 
+ template<typename T>
+@@ -62,7 +82,35 @@ noexcept
+             GCLIM<T>::min() > abs(y) ? \
+                 abs(x) :
+             // else
+-            hypot_compute(x, y/x) );
++            hypot_compute(x, y) );
++}
++
++template<typename T>
++constexpr
++T
++hypot_vals_check(const T x, const T y, const T z)
++noexcept
++{
++    return( any_nan(x, y, z) ? \
++                GCLIM<T>::quiet_NaN() :
++            //
++            any_inf(x,y,z) ? \
++                GCLIM<T>::infinity() :
++            // indistinguishable from zero or one
++            GCLIM<T>::min() > abs(x) && GCLIM<T>::min() > abs(y) ? \
++                abs(z) :
++            GCLIM<T>::min() > abs(x) && GCLIM<T>::min() > abs(z) ? \
++                abs(y) :
++            GCLIM<T>::min() > abs(y) && GCLIM<T>::min() > abs(z) ? \
++                abs(x) :
++            GCLIM<T>::min() > abs(x) ? \
++                hypot_vals_check(y, z) :
++            GCLIM<T>::min() > abs(y) ? \
++                hypot_vals_check(x, z) :
++            GCLIM<T>::min() > abs(z) ? \
++                hypot_vals_check(x, y) :
++            // else
++            hypot_compute(x, y, z) );
+ }
+ 
+ template<typename T1, typename T2, typename TC = common_return_t<T1,T2>>
+@@ -74,6 +122,15 @@ noexcept
+     return hypot_vals_check(static_cast<TC>(x),static_cast<TC>(y));
+ }
+ 
++template<typename T1, typename T2, typename T3, typename TC = common_return_t<T1,T2,T3>>
++constexpr
++TC
++hypot_type_check(const T1 x, const T2 y, const T3 z)
++noexcept
++{
++    return hypot_vals_check(static_cast<TC>(x),static_cast<TC>(y),static_cast<TC>(z));
++}
++
+ }
+ 
+ /**
+@@ -97,6 +154,28 @@ noexcept
+   }
+ }
+ 
++/**
++ * Compile-time Pythagorean addition function
++ *
++ * @param x a real-valued input.
++ * @param y a real-valued input.
++ * @param z a real-valued input.
++ * @return Computes \f$ x \oplus y \oplus z = \sqrt{x^2 + y^2 + z^2} \f$.
++ */
++
++template<typename T1, typename T2, typename T3>
++constexpr
++common_return_t<T1,T2,T3>
++hypot(const T1 x, const T2 y, const T3 z)
++noexcept
++{
++  if (std::is_constant_evaluated()) {
++    return internal::hypot_type_check(x,y,z);
++  } else {
++    return std::hypot(x, y, z);
++  }
++}
++
+ }
+ 
+ #endif