Add math::dual weak comparison operators & some transcendental functions
This commit is contained in:
parent
2cce0082cf
commit
78ea54ac2d
1 changed files with 45 additions and 0 deletions
|
|
@ -3,6 +3,7 @@
|
||||||
#include <psemek/math/vector.hpp>
|
#include <psemek/math/vector.hpp>
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <compare>
|
||||||
|
|
||||||
namespace psemek::math
|
namespace psemek::math
|
||||||
{
|
{
|
||||||
|
|
@ -148,6 +149,50 @@ namespace psemek::math
|
||||||
return v * inverse(d);
|
return v * inverse(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Exists mostly to make max/min/clamp/etc work
|
||||||
|
template <typename T, std::size_t N>
|
||||||
|
std::partial_ordering operator <=> (dual<T, N> const & d1, dual<T, N> const & d2)
|
||||||
|
{
|
||||||
|
return d1.scalar <=> d2.scalar;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, std::size_t N>
|
||||||
|
dual<T, N> abs(dual<T, N> const & d)
|
||||||
|
{
|
||||||
|
return d.scalar > T{0} ? d : -d;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, std::size_t N>
|
||||||
|
dual<T, N> exp(dual<T, N> const & d)
|
||||||
|
{
|
||||||
|
auto e = std::exp(d.scalar);
|
||||||
|
return {e, e * d.delta};
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, std::size_t N>
|
||||||
|
dual<T, N> log(dual<T, N> const & d)
|
||||||
|
{
|
||||||
|
return {std::log(d.scalar), d.delta / d.scalar};
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, std::size_t N>
|
||||||
|
dual<T, N> sin(dual<T, N> const & d)
|
||||||
|
{
|
||||||
|
return {std::sin(d.scalar), std::cos(d.scalar) * d.delta};
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, std::size_t N>
|
||||||
|
dual<T, N> cos(dual<T, N> const & d)
|
||||||
|
{
|
||||||
|
return {std::cos(d.scalar), - std::sin(d.scalar) * d.delta};
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, std::size_t N>
|
||||||
|
dual<T, N> pow(dual<T, N> const & d1, dual<T, N> const & d2)
|
||||||
|
{
|
||||||
|
return exp(log(d1) * d2);
|
||||||
|
}
|
||||||
|
|
||||||
template <typename T, std::size_t N>
|
template <typename T, std::size_t N>
|
||||||
std::ostream & operator << (std::ostream & os, dual<T, N> const & d)
|
std::ostream & operator << (std::ostream & os, dual<T, N> const & d)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue