diff --git a/src/include/units/bits/common_quantity.h b/src/include/units/bits/common_quantity.h index 33cf6970..ceabedf6 100644 --- a/src/include/units/bits/common_quantity.h +++ b/src/include/units/bits/common_quantity.h @@ -52,7 +52,11 @@ struct common_quantity_impl, quantity, Rep> template struct common_quantity_impl, quantity, Rep> { using dimension = conditional, D2, D1>; - using type = quantity, Rep>; + static constexpr ratio r1 = D1::base_units_ratio * U1::ratio; + static constexpr ratio r2 = D2::base_units_ratio * U2::ratio; + static constexpr ratio cr = common_ratio(r1, r2); + using unit = downcast_unit; + using type = quantity; }; template diff --git a/src/include/units/quantity_cast.h b/src/include/units/quantity_cast.h index 965f1159..d1a093f6 100644 --- a/src/include/units/quantity_cast.h +++ b/src/include/units/quantity_cast.h @@ -313,7 +313,14 @@ struct quantity_cast_impl { template constexpr ratio cast_ratio(const Q1& from, const Q2& to) { - return quantity_ratio(from) / quantity_ratio(to); + using FromU = Q1::unit; + using ToU = Q2::unit; + if constexpr(same_unit_reference::value) { + return FromU::ratio / ToU::ratio; + } + else { + return quantity_ratio(from) / quantity_ratio(to); + } } } // namespace detail diff --git a/test/unit_test/static/si_fps_test.cpp b/test/unit_test/static/si_fps_test.cpp index b857400f..0bca26fc 100644 --- a/test/unit_test/static/si_fps_test.cpp +++ b/test/unit_test/static/si_fps_test.cpp @@ -69,8 +69,7 @@ static_assert(fps::length(1) == 0.3048q_m); static_assert(fps::mass(1) == 0.45359237q_kg); static_assert(fps::time(1) == 1q_s); static_assert(fps::speed(1) == 0.3048q_m_per_s); -static_assert(fps::area(1) > 0.09290303q_m2 && - fps::area(1) < 0.09290305q_m2); +static_assert(fps::area(1) == 0.09290304q_m2); static_assert(fps::acceleration(1) == 0.3048q_m_per_s2); static_assert(fps::force(1) > 0.138254q_N && fps::force(1) < 0.138256q_N); @@ -113,8 +112,7 @@ static_assert(1q_ft == 0.3048q_m); static_assert(1q_lb == 0.45359237q_kg); static_assert(1q_s == 1q_s); static_assert(1q_ft_per_s == 0.3048q_m_per_s); -static_assert(1q_ft2 > 0.09290303q_m2 && - 1q_ft2 < 0.09290305q_m2); +static_assert(1q_ft2 == 0.09290304q_m2); static_assert(1q_ft_per_s2 == 0.3048q_m_per_s2); static_assert(1q_pdl > 0.138254q_N && 1q_pdl < 0.138256q_N);