Skip to content

Commit 0ff81a4

Browse files
vrqqJohn McFarlane
authored and
John McFarlane
committed
Try to fix issue #991
1 parent aedf166 commit 0ff81a4

File tree

3 files changed

+55
-12
lines changed

3 files changed

+55
-12
lines changed

include/cnl/_impl/num_traits/scale.h

-12
Original file line numberDiff line numberDiff line change
@@ -46,18 +46,6 @@ namespace cnl {
4646
: _impl::default_scale<Digits, Radix, S> {
4747
};
4848

49-
template<int Digits, int Radix, template<typename, typename>
50-
class TNUM, typename S, typename Tag>
51-
struct scale<Digits, Radix, TNUM<S, Tag>, _impl::enable_if_t<(
52-
Digits<0 && cnl::_impl::is_integral<S>::value)>>
53-
{
54-
CNL_NODISCARD constexpr auto operator()(TNUM<S, Tag> const& s) const
55-
-> decltype(s/_impl::power_value<S, -Digits, Radix>())
56-
{
57-
return s/_impl::power_value<S, -Digits, Radix>();
58-
}
59-
};
60-
6149
namespace _impl {
6250
// cnl::_impl::scale - convenience wrapper for cnl::scale
6351
template<int Digits, int Radix=2, class S>

include/cnl/rounding_integer.h

+10
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,16 @@ namespace cnl {
7171
scale<Digits, Radix, Rep>{}(_impl::to_rep(s)));
7272
}
7373
};
74+
75+
template<int Digits, int Radix, class Rep, class RoundingTag>
76+
struct scale<Digits, Radix, _impl::number<Rep, RoundingTag>,
77+
_impl::enable_if_t<Digits < 0 && _impl::is_rounding_tag<RoundingTag>::value>> {
78+
CNL_NODISCARD constexpr auto operator()(_impl::number<Rep, RoundingTag> const& s) const
79+
-> decltype(s/_impl::power_value<Rep, -Digits, Radix>())
80+
{
81+
return s/_impl::power_value<Rep, -Digits, Radix>();
82+
}
83+
};
7484

7585
////////////////////////////////////////////////////////////////////////////////
7686
// cnl::set_rep<rounding_integer, Rep>

test/unit/scaled_integer/rounding/rounding_scaled_integer.cpp

+45
Original file line numberDiff line numberDiff line change
@@ -90,4 +90,49 @@ namespace {
9090
DecX num2 = 10.545;
9191
std::cout<<num1<<" "<<num2<<std::endl;
9292
}
93+
94+
TEST(rounding_scaled_integer, 991AssignTest)
95+
{
96+
using DecX_2 = cnl::scaled_integer<cnl::rounding_integer<long long>, cnl::power<-2, 10>>;
97+
using DecX_4 = cnl::scaled_integer<cnl::rounding_integer<long long>, cnl::power<-4, 10>>;
98+
99+
DecX_2 n1 = 10.0151;
100+
DecX_2 n2 = 10.0249;
101+
EXPECT_EQ(n1, n2); // 10.02
102+
103+
int64_t xn = (int64_t)n1;
104+
double xm = (double)n2;
105+
EXPECT_EQ(xn, 10);
106+
EXPECT_DOUBLE_EQ(xm, 10.02);
107+
108+
static_assert(std::is_same_v<decltype(n1*n2), DecX_4>);
109+
EXPECT_EQ(n1*n2, DecX_4{100.4004});
110+
EXPECT_DOUBLE_EQ((double)(n1*n2), 100.4004);
111+
112+
n1 += 0.6;
113+
EXPECT_EQ((int)n1, 11);
114+
115+
n1 += 0.38;
116+
EXPECT_EQ(n1, 11);
117+
118+
xn += n1;
119+
xm -= n1;
120+
}
121+
122+
TEST(rounding_scaled_integer, 991CmpTest)
123+
{
124+
using DecX_2 = cnl::scaled_integer<cnl::rounding_integer<long long>, cnl::power<-2, 10>>;
125+
126+
DecX_2 n1;
127+
DecX_2 n2 = 10.019;
128+
DecX_2 n3{20.029};
129+
EXPECT_DOUBLE_EQ((double)n2, 10.02);
130+
EXPECT_DOUBLE_EQ((double)n3, 20.03);
131+
132+
n1 = 3.999; //4.00 instead
133+
n3 = DecX_2(8);
134+
EXPECT_NE(n1, 3.9899999999999999999999999);
135+
EXPECT_EQ(n1, 4.0000000000000000000000001);
136+
EXPECT_EQ(n3, 8);
137+
}
93138
}

0 commit comments

Comments
 (0)