mirror of
https://github.com/mpusz/mp-units.git
synced 2025-07-30 10:27:16 +02:00
fix: pow
, sqrt
, and cbrt
fixed for quantities
This commit is contained in:
@ -51,17 +51,17 @@ namespace mp_units {
|
|||||||
*/
|
*/
|
||||||
template<std::intmax_t Num, std::intmax_t Den = 1, Quantity Q>
|
template<std::intmax_t Num, std::intmax_t Den = 1, Quantity Q>
|
||||||
requires detail::non_zero<Den>
|
requires detail::non_zero<Den>
|
||||||
[[nodiscard]] constexpr auto pow(const Q& q) noexcept
|
[[nodiscard]] constexpr Quantity auto pow(const Q& q) noexcept
|
||||||
requires requires { pow(q.number(), 1.0); } || requires { std::pow(q.number(), 1.0); }
|
requires requires { pow(q.number(), 1.0); } || requires { std::pow(q.number(), 1.0); }
|
||||||
{
|
{
|
||||||
using rep = TYPENAME Q::rep;
|
using rep = TYPENAME Q::rep;
|
||||||
if constexpr (Num == 0) {
|
if constexpr (Num == 0) {
|
||||||
return rep(1);
|
return make_quantity<pow<Num, Den>(Q::reference)>(rep(1));
|
||||||
} else if constexpr (ratio{Num, Den} == 1) {
|
} else if constexpr (ratio{Num, Den} == 1) {
|
||||||
return q;
|
return q;
|
||||||
} else {
|
} else {
|
||||||
using std::pow;
|
using std::pow;
|
||||||
return make_quantity<reference<pow<Num, Den>(Q::quantity_spec), pow<Num, Den>(Q::unit)>{}>(
|
return make_quantity<pow<Num, Den>(Q::reference)>(
|
||||||
static_cast<rep>(pow(q.number(), static_cast<double>(Num) / static_cast<double>(Den))));
|
static_cast<rep>(pow(q.number(), static_cast<double>(Num) / static_cast<double>(Den))));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -80,8 +80,7 @@ template<Quantity Q>
|
|||||||
{
|
{
|
||||||
using rep = TYPENAME Q::rep;
|
using rep = TYPENAME Q::rep;
|
||||||
using std::sqrt;
|
using std::sqrt;
|
||||||
return make_quantity<reference<pow<1, 2>(Q::quantity_spec), pow<1, 2>(Q::unit)>{}>(
|
return make_quantity<sqrt(Q::reference)>(static_cast<rep>(sqrt(q.number())));
|
||||||
static_cast<rep>(sqrt(q.number())));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -98,8 +97,7 @@ template<Quantity Q>
|
|||||||
{
|
{
|
||||||
using rep = TYPENAME Q::rep;
|
using rep = TYPENAME Q::rep;
|
||||||
using std::cbrt;
|
using std::cbrt;
|
||||||
return make_quantity<reference<pow<1, 3>(Q::quantity_spec), pow<1, 3>(Q::unit)>{}>(
|
return make_quantity<cbrt(Q::reference)>(static_cast<rep>(cbrt(q.number())));
|
||||||
static_cast<rep>(cbrt(q.number())));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user