Skip to content

Commit 28a8554

Browse files
committed
Fix zero operand case
1 parent d0f6bf5 commit 28a8554

File tree

1 file changed

+52
-40
lines changed

1 file changed

+52
-40
lines changed

include/boost/decimal/detail/add_impl.hpp

Lines changed: 52 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -74,34 +74,40 @@ constexpr auto add_impl(const T& lhs, const T& rhs) noexcept -> ReturnType
7474
// Need to check for the case where we have 1e+95 - anything = 9.99999... without losing a nine
7575
if (use_lhs)
7676
{
77-
const auto removed_zeros {detail::remove_trailing_zeros(big_lhs)};
78-
if (removed_zeros.trimmed_number == 1U)
79-
{
80-
--big_lhs;
81-
big_lhs *= 10U;
82-
big_lhs += 9U;
83-
--lhs_exp;
84-
}
85-
else
77+
if (big_rhs != 0U)
8678
{
87-
--big_lhs;
79+
const auto removed_zeros {detail::remove_trailing_zeros(big_lhs)};
80+
if (removed_zeros.trimmed_number == 1U)
81+
{
82+
--big_lhs;
83+
big_lhs *= 10U;
84+
big_lhs += 9U;
85+
--lhs_exp;
86+
}
87+
else
88+
{
89+
--big_lhs;
90+
}
8891
}
8992

9093
return ReturnType{big_lhs, lhs_exp, lhs.isneg()};
9194
}
9295
else
9396
{
94-
const auto removed_zeros {detail::remove_trailing_zeros(big_rhs)};
95-
if (removed_zeros.trimmed_number == 1U)
97+
if (big_lhs != 0U)
9698
{
97-
--big_rhs;
98-
big_rhs *= 10U;
99-
big_rhs += 9U;
100-
--rhs_exp;
101-
}
102-
else
103-
{
104-
--big_rhs;
99+
const auto removed_zeros {detail::remove_trailing_zeros(big_rhs)};
100+
if (removed_zeros.trimmed_number == 1U)
101+
{
102+
--big_rhs;
103+
big_rhs *= 10U;
104+
big_rhs += 9U;
105+
--rhs_exp;
106+
}
107+
else
108+
{
109+
--big_rhs;
110+
}
105111
}
106112

107113
return ReturnType{big_rhs, rhs_exp, rhs.isneg()};
@@ -186,34 +192,40 @@ constexpr auto d128_add_impl(T lhs_sig, U lhs_exp, bool lhs_sign,
186192
// Need to check for the case where we have 1e+95 - anything = 9.99999... without losing a nine
187193
if (use_lhs)
188194
{
189-
const auto removed_zeros {detail::remove_trailing_zeros(lhs_sig)};
190-
if (removed_zeros.trimmed_number == 1U)
195+
if (rhs_sig != 0U)
191196
{
192-
--lhs_sig;
193-
lhs_sig *= 10U;
194-
lhs_sig += 9U;
195-
--lhs_exp;
196-
}
197-
else
198-
{
199-
--lhs_sig;
197+
const auto removed_zeros {detail::remove_trailing_zeros(lhs_sig)};
198+
if (removed_zeros.trimmed_number == 1U)
199+
{
200+
--lhs_sig;
201+
lhs_sig *= 10U;
202+
lhs_sig += 9U;
203+
--lhs_exp;
204+
}
205+
else
206+
{
207+
--lhs_sig;
208+
}
200209
}
201210

202211
return ReturnType{lhs_sig, lhs_exp, lhs_sign};
203212
}
204213
else
205214
{
206-
const auto removed_zeros {detail::remove_trailing_zeros(rhs_sig)};
207-
if (removed_zeros.trimmed_number == 1U)
208-
{
209-
--rhs_sig;
210-
rhs_sig *= 10U;
211-
rhs_sig += 9U;
212-
--rhs_exp;
213-
}
214-
else
215+
if (lhs_sig != 0U)
215216
{
216-
--rhs_sig;
217+
const auto removed_zeros {detail::remove_trailing_zeros(rhs_sig)};
218+
if (removed_zeros.trimmed_number == 1U)
219+
{
220+
--rhs_sig;
221+
rhs_sig *= 10U;
222+
rhs_sig += 9U;
223+
--rhs_exp;
224+
}
225+
else
226+
{
227+
--rhs_sig;
228+
}
217229
}
218230

219231
return ReturnType{rhs_sig, rhs_exp, rhs_sign};

0 commit comments

Comments
 (0)