diff --git a/src/Math/Dual.h b/src/Math/Dual.h index 094c22805..ba75f66a1 100644 --- a/src/Math/Dual.h +++ b/src/Math/Dual.h @@ -19,6 +19,7 @@ * @brief Class Magnum::Math::Dual */ +#include #include #include "Math/MathTypeTraits.h" @@ -191,6 +192,19 @@ template Corrade::Utility::Debug operator<<(Corrade::Utility::Debug deb return debug; } +/** @relates Dual +@brief Square root of dual number + +@f[ + \sqrt{\hat a} = \sqrt{a_0} + \epsilon \frac{a_\epsilon}{2 \sqrt{a_0}} +@f] +@see Math::sqrt(const T&) +*/ +template Dual sqrt(const Dual& dual) { + T sqrt0 = std::sqrt(dual.real()); + return {sqrt0, dual.dual()/(2*sqrt0)}; +} + }} #endif diff --git a/src/Math/Test/DualTest.cpp b/src/Math/Test/DualTest.cpp index 527b9c85d..19d74583a 100644 --- a/src/Math/Test/DualTest.cpp +++ b/src/Math/Test/DualTest.cpp @@ -33,6 +33,7 @@ class DualTest: public Corrade::TestSuite::Tester { void multiplyDivide(); void conjugated(); + void sqrt(); void debug(); }; @@ -49,6 +50,7 @@ DualTest::DualTest() { &DualTest::multiplyDivide, &DualTest::conjugated, + &DualTest::sqrt, &DualTest::debug); } @@ -104,6 +106,10 @@ void DualTest::conjugated() { CORRADE_COMPARE(Dual(1.0f, -6.5f).conjugated(), Dual(1.0f, 6.5f)); } +void DualTest::sqrt() { + CORRADE_COMPARE(Math::sqrt(Dual(16.0f, 2.0f)), Dual(4.0f, 0.25f)); +} + void DualTest::debug() { std::ostringstream o;