diff --git a/Framework/Utilities/COMBoost.cc b/Framework/Utilities/COMBoost.cc
index 1d65d6439a2731a70988d440b76ed4e68a77262f..eedabc6f99b5f5df2cda9fa2354ca8e474f054d2 100644
--- a/Framework/Utilities/COMBoost.cc
+++ b/Framework/Utilities/COMBoost.cc
@@ -15,6 +15,8 @@
 #include <corsika/utl/COMBoost.h>
 #include <corsika/utl/sgn.h>
 
+#include <cmath>
+
 using namespace corsika::utl;
 using namespace corsika::units::si;
 using namespace corsika::geometry;
@@ -23,16 +25,17 @@ COMBoost::COMBoost(FourVector<HEPEnergyType, Vector<hepmomentum_d>> const& Pproj
                    const HEPMassType massTarget)
     : fCS(Pprojectile.GetSpaceLikeComponents().GetCoordinateSystem()) {
   auto const pProjectile = Pprojectile.GetSpaceLikeComponents();
-  auto const pProjNorm = pProjectile.norm();
+  auto const pProjNormSquared = pProjectile.squaredNorm();
+  auto const pProjNorm = sqrt(pProjNormSquared);
   auto const a = (pProjectile / pProjNorm).GetComponents().eVector;
   auto const a1 = a(0), a2 = a(1);
 
-  auto const s = sgn(a(2));
-  auto const c = 1 / (1 + s * a(2));
+  auto const sign = sgn(a(2));
+  auto const c = 1 / (1 + sign * a(2));
 
   Eigen::Matrix3d A, B;
 
-  if (s > 0) {
+  if (sign > 0) {
     A << 1, 0, -a1,                     // comment to prevent clang-format
         0, 1, -a2,                      // .
         a1, a2, 1;                      // .
@@ -51,15 +54,17 @@ COMBoost::COMBoost(FourVector<HEPEnergyType, Vector<hepmomentum_d>> const& Pproj
 
   fRotation = A + B;
 
-  // calculate boost
-  double const beta = pProjNorm / (Pprojectile.GetTimeLikeComponent() + massTarget);
+  auto const eProjectile = Pprojectile.GetTimeLikeComponent();
+  auto const massProjectileSquared = eProjectile * eProjectile - pProjNormSquared;
+  auto const s =
+      massTarget * massTarget + massProjectileSquared + 2 * eProjectile * massTarget;
 
-  /* Accurracy matters here, beta = 1 - epsilon for ultra-relativistic boosts */
-  double const coshEta = 1 / std::sqrt((1 + beta) * (1 - beta));
-  //~ double const coshEta = 1 / std::sqrt((1-beta*beta));
-  double const sinhEta = -beta * coshEta;
+  auto const sqrtS = sqrt(s);
+  auto const sinhEta = -pProjNorm / sqrtS;
+  auto const coshEta = sqrt(1 + pProjNormSquared / s);
 
-  std::cout << "COMBoost (1-beta)=" << 1 - beta << " gamma=" << coshEta << std::endl;
+  std::cout << "COMBoost (1-beta)=" << 1 - sinhEta / coshEta << " gamma=" << coshEta
+            << std::endl;
   std::cout << "  det = " << fRotation.determinant() - 1 << std::endl;
 
   fBoost << coshEta, sinhEta, sinhEta, coshEta;