FindRoot.h 929 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  2. // SPDX-License-Identifier: MIT
  3. #pragma once
  4. JPH_NAMESPACE_BEGIN
  5. /// Find the roots of \f$inA \: x^2 + inB \: x + inC = 0\f$.
  6. /// @return The number of roots, actual roots in outX1 and outX2.
  7. /// If number of roots returned is 1 then outX1 == outX2.
  8. template <typename T>
  9. inline int FindRoot(const T inA, const T inB, const T inC, T &outX1, T &outX2)
  10. {
  11. // Check if this is a linear equation
  12. if (inA == T(0))
  13. {
  14. // Check if this is a constant equation
  15. if (inB == T(0))
  16. return 0;
  17. // Linear equation with 1 solution
  18. outX1 = outX2 = -inC / inB;
  19. return 1;
  20. }
  21. // See Numerical Recipes in C, Chapter 5.6 Quadratic and Cubic Equations
  22. T det = Square(inB) - T(4) * inA * inC;
  23. if (det < T(0))
  24. return 0;
  25. T q = (inB + Sign(inB) * sqrt(det)) / T(-2);
  26. outX1 = q / inA;
  27. if (q == T(0))
  28. {
  29. outX2 = outX1;
  30. return 1;
  31. }
  32. outX2 = inC / q;
  33. return 2;
  34. }
  35. JPH_NAMESPACE_END