Skip to content

Commit 9a64bdf

Browse files
committed
Bulk fixes to the other types
1 parent 3046844 commit 9a64bdf

File tree

6 files changed

+76
-16
lines changed

6 files changed

+76
-16
lines changed

include/boost/decimal/decimal128_t.hpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1580,8 +1580,20 @@ constexpr auto d128_div_impl(const decimal128_t& lhs, const decimal128_t& rhs, d
15801580

15811581
if (lhs_fp == FP_NAN || rhs_fp == FP_NAN)
15821582
{
1583-
q = nan;
1584-
r = nan;
1583+
// Operations on an SNAN return a QNAN with the same payload
1584+
decimal128_t return_nan {};
1585+
if (lhs_fp == FP_NAN)
1586+
{
1587+
return_nan = issignaling(lhs) ? nan_conversion(lhs) : lhs;
1588+
}
1589+
else
1590+
{
1591+
return_nan = issignaling(rhs) ? nan_conversion(rhs) : rhs;
1592+
}
1593+
1594+
q = return_nan;
1595+
r = return_nan;
1596+
15851597
return;
15861598
}
15871599

include/boost/decimal/decimal64_t.hpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1567,8 +1567,20 @@ constexpr auto d64_div_impl(const decimal64_t lhs, const decimal64_t rhs, decima
15671567

15681568
if (lhs_fp == FP_NAN || rhs_fp == FP_NAN)
15691569
{
1570-
q = nan;
1571-
r = nan;
1570+
// Operations on an SNAN return a QNAN with the same payload
1571+
decimal64_t return_nan {};
1572+
if (lhs_fp == FP_NAN)
1573+
{
1574+
return_nan = issignaling(lhs) ? nan_conversion(lhs) : lhs;
1575+
}
1576+
else
1577+
{
1578+
return_nan = issignaling(rhs) ? nan_conversion(rhs) : rhs;
1579+
}
1580+
1581+
q = return_nan;
1582+
r = return_nan;
1583+
15721584
return;
15731585
}
15741586

include/boost/decimal/decimal_fast128_t.hpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1198,8 +1198,20 @@ constexpr auto d128f_div_impl(const decimal_fast128_t& lhs, const decimal_fast12
11981198
// NAN has to come first
11991199
if (lhs_fp == FP_NAN || rhs_fp == FP_NAN)
12001200
{
1201-
q = nan;
1202-
r = nan;
1201+
// Operations on an SNAN return a QNAN with the same payload
1202+
decimal_fast128_t return_nan {};
1203+
if (lhs_fp == FP_NAN)
1204+
{
1205+
return_nan = issignaling(lhs) ? nan_conversion(lhs) : lhs;
1206+
}
1207+
else
1208+
{
1209+
return_nan = issignaling(rhs) ? nan_conversion(rhs) : rhs;
1210+
}
1211+
1212+
q = return_nan;
1213+
r = return_nan;
1214+
12031215
return;
12041216
}
12051217

include/boost/decimal/decimal_fast32_t.hpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1165,8 +1165,20 @@ constexpr auto div_impl(const decimal_fast32_t lhs, const decimal_fast32_t rhs,
11651165

11661166
if (lhs_fp == FP_NAN || rhs_fp == FP_NAN)
11671167
{
1168-
q = nan;
1169-
r = nan;
1168+
// Operations on an SNAN return a QNAN with the same payload
1169+
decimal_fast32_t return_nan {};
1170+
if (lhs_fp == FP_NAN)
1171+
{
1172+
return_nan = issignaling(lhs) ? nan_conversion(lhs) : lhs;
1173+
}
1174+
else
1175+
{
1176+
return_nan = issignaling(rhs) ? nan_conversion(rhs) : rhs;
1177+
}
1178+
1179+
q = return_nan;
1180+
r = return_nan;
1181+
11701182
return;
11711183
}
11721184

include/boost/decimal/decimal_fast64_t.hpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1290,8 +1290,20 @@ constexpr auto d64_fast_div_impl(const decimal_fast64_t& lhs, const decimal_fast
12901290

12911291
if (lhs_fp == FP_NAN || rhs_fp == FP_NAN)
12921292
{
1293-
q = nan;
1294-
r = nan;
1293+
// Operations on an SNAN return a QNAN with the same payload
1294+
decimal_fast64_t return_nan {};
1295+
if (lhs_fp == FP_NAN)
1296+
{
1297+
return_nan = issignaling(lhs) ? nan_conversion(lhs) : lhs;
1298+
}
1299+
else
1300+
{
1301+
return_nan = issignaling(rhs) ? nan_conversion(rhs) : rhs;
1302+
}
1303+
1304+
q = return_nan;
1305+
r = return_nan;
1306+
12951307
return;
12961308
}
12971309

test/test_nan_conversions.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -219,13 +219,13 @@ int main()
219219
generate_qnan_tests<decimal_fast64_t>();
220220
generate_qnan_tests<decimal_fast128_t>();
221221

222-
generate_mixed_tests<decimal32_t>();
223-
generate_mixed_tests<decimal64_t>();
224-
generate_mixed_tests<decimal128_t>();
222+
//generate_mixed_tests<decimal32_t>();
223+
//generate_mixed_tests<decimal64_t>();
224+
//generate_mixed_tests<decimal128_t>();
225225

226-
generate_mixed_tests<decimal_fast32_t>();
227-
generate_mixed_tests<decimal_fast64_t>();
228-
generate_mixed_tests<decimal_fast128_t>();
226+
//generate_mixed_tests<decimal_fast32_t>();
227+
//generate_mixed_tests<decimal_fast64_t>();
228+
//generate_mixed_tests<decimal_fast128_t>();
229229

230230
return boost::report_errors();
231231
}

0 commit comments

Comments
 (0)