Skip to content

Commit 6b86049

Browse files
committed
Implement support for 7.2.e
1 parent 0956d71 commit 6b86049

File tree

6 files changed

+130
-34
lines changed

6 files changed

+130
-34
lines changed

include/boost/decimal/decimal128_t.hpp

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1429,8 +1429,8 @@ constexpr auto d128_div_impl(const decimal128_t& lhs, const decimal128_t& rhs, d
14291429
#ifndef BOOST_DECIMAL_FAST_MATH
14301430
// Check pre-conditions
14311431
constexpr decimal128_t zero {0, 0};
1432-
constexpr decimal128_t nan {boost::decimal::from_bits(boost::decimal::detail::d128_snan_mask)};
1433-
constexpr decimal128_t inf {boost::decimal::from_bits(boost::decimal::detail::d128_inf_mask)};
1432+
constexpr decimal128_t nan {from_bits(detail::d128_nan_mask)};
1433+
constexpr decimal128_t inf {from_bits(detail::d128_inf_mask)};
14341434

14351435
const bool sign {lhs.isneg() != rhs.isneg()};
14361436

@@ -1447,12 +1447,28 @@ constexpr auto d128_div_impl(const decimal128_t& lhs, const decimal128_t& rhs, d
14471447
switch (lhs_fp)
14481448
{
14491449
case FP_INFINITE:
1450-
q = sign ? -inf : inf;
1451-
r = zero;
1450+
if (rhs_fp == FP_INFINITE)
1451+
{
1452+
q = nan;
1453+
r = nan;
1454+
}
1455+
else
1456+
{
1457+
q = sign ? -inf : inf;
1458+
r = zero;
1459+
}
14521460
return;
14531461
case FP_ZERO:
1454-
q = sign ? -zero : zero;
1455-
r = sign ? -zero : zero;
1462+
if (rhs_fp == FP_ZERO)
1463+
{
1464+
q = nan;
1465+
r = nan;
1466+
}
1467+
else
1468+
{
1469+
q = sign ? -zero : zero;
1470+
r = sign ? -zero : zero;
1471+
}
14561472
return;
14571473
default:
14581474
static_cast<void>(lhs);

include/boost/decimal/decimal32_t.hpp

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1733,8 +1733,8 @@ constexpr auto div_impl(const decimal32_t lhs, const decimal32_t rhs, decimal32_
17331733
#ifndef BOOST_DECIMAL_FAST_MATH
17341734
// Check pre-conditions
17351735
constexpr decimal32_t zero {0, 0};
1736-
constexpr decimal32_t nan {boost::decimal::from_bits(boost::decimal::detail::d32_snan_mask)};
1737-
constexpr decimal32_t inf {boost::decimal::from_bits(boost::decimal::detail::d32_inf_mask)};
1736+
constexpr decimal32_t nan {from_bits(detail::d32_nan_mask)};
1737+
constexpr decimal32_t inf {from_bits(detail::d32_inf_mask)};
17381738

17391739
const bool sign {lhs.isneg() != rhs.isneg()};
17401740

@@ -1751,12 +1751,28 @@ constexpr auto div_impl(const decimal32_t lhs, const decimal32_t rhs, decimal32_
17511751
switch (lhs_fp)
17521752
{
17531753
case FP_INFINITE:
1754-
q = sign ? -inf : inf;
1755-
r = zero;
1754+
if (rhs_fp == FP_INFINITE)
1755+
{
1756+
q = nan;
1757+
r = nan;
1758+
}
1759+
else
1760+
{
1761+
q = sign ? -inf : inf;
1762+
r = zero;
1763+
}
17561764
return;
17571765
case FP_ZERO:
1758-
q = sign ? -zero : zero;
1759-
r = sign ? -zero : zero;
1766+
if (rhs_fp == FP_ZERO)
1767+
{
1768+
q = nan;
1769+
r = nan;
1770+
}
1771+
else
1772+
{
1773+
q = sign ? -zero : zero;
1774+
r = sign ? -zero : zero;
1775+
}
17601776
return;
17611777
default:
17621778
static_cast<void>(lhs);

include/boost/decimal/decimal64_t.hpp

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1143,8 +1143,8 @@ constexpr auto d64_div_impl(const decimal64_t lhs, const decimal64_t rhs, decima
11431143
#ifndef BOOST_DECIMAL_FAST_MATH
11441144
// Check pre-conditions
11451145
constexpr decimal64_t zero {0, 0};
1146-
constexpr decimal64_t nan {boost::decimal::from_bits(boost::decimal::detail::d64_snan_mask)};
1147-
constexpr decimal64_t inf {boost::decimal::from_bits(boost::decimal::detail::d64_inf_mask)};
1146+
constexpr decimal64_t nan {from_bits(detail::d64_nan_mask)};
1147+
constexpr decimal64_t inf {from_bits(detail::d64_inf_mask)};
11481148

11491149
const auto lhs_fp {fpclassify(lhs)};
11501150
const auto rhs_fp {fpclassify(rhs)};
@@ -1159,12 +1159,28 @@ constexpr auto d64_div_impl(const decimal64_t lhs, const decimal64_t rhs, decima
11591159
switch (lhs_fp)
11601160
{
11611161
case FP_INFINITE:
1162-
q = sign ? -inf : inf;
1163-
r = zero;
1162+
if (lhs_fp == FP_INFINITE)
1163+
{
1164+
q = nan;
1165+
r = nan;
1166+
}
1167+
else
1168+
{
1169+
q = sign ? -inf : inf;
1170+
r = zero;
1171+
}
11641172
return;
11651173
case FP_ZERO:
1166-
q = sign ? -zero : zero;
1167-
r = sign ? -zero : zero;
1174+
if (rhs_fp == FP_ZERO)
1175+
{
1176+
q = nan;
1177+
r = nan;
1178+
}
1179+
else
1180+
{
1181+
q = sign ? -zero : zero;
1182+
r = sign ? -zero : zero;
1183+
}
11681184
return;
11691185
default:
11701186
static_cast<void>(lhs);

include/boost/decimal/decimal_fast128_t.hpp

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1085,8 +1085,8 @@ constexpr auto d128f_div_impl(const decimal_fast128_t& lhs, const decimal_fast12
10851085
#ifndef BOOST_DECIMAL_FAST_MATH
10861086
// Check pre-conditions
10871087
constexpr decimal_fast128_t zero {0, 0};
1088-
constexpr decimal_fast128_t nan {boost::decimal::direct_init_d128(boost::decimal::detail::d128_fast_qnan, 0, false)};
1089-
constexpr decimal_fast128_t inf {boost::decimal::direct_init_d128(boost::decimal::detail::d128_fast_inf, 0, false)};
1088+
constexpr decimal_fast128_t nan {direct_init_d128(detail::d128_fast_qnan, 0, false)};
1089+
constexpr decimal_fast128_t inf {direct_init_d128(detail::d128_fast_inf, 0, false)};
10901090

10911091
const auto lhs_fp {fpclassify(lhs)};
10921092
const auto rhs_fp {fpclassify(rhs)};
@@ -1102,12 +1102,28 @@ constexpr auto d128f_div_impl(const decimal_fast128_t& lhs, const decimal_fast12
11021102
switch (lhs_fp)
11031103
{
11041104
case FP_INFINITE:
1105-
q = sign ? -inf : inf;
1106-
r = zero;
1105+
if (rhs_fp == FP_INFINITE)
1106+
{
1107+
q = nan;
1108+
r = nan;
1109+
}
1110+
else
1111+
{
1112+
q = sign ? -inf : inf;
1113+
r = zero;
1114+
}
11071115
return;
11081116
case FP_ZERO:
1109-
q = sign ? -zero : zero;
1110-
r = sign ? -zero : zero;
1117+
if (rhs_fp == FP_ZERO)
1118+
{
1119+
q = nan;
1120+
r = nan;
1121+
}
1122+
else
1123+
{
1124+
q = sign ? -zero : zero;
1125+
r = sign ? -zero : zero;
1126+
}
11111127
return;
11121128
default:
11131129
static_cast<void>(lhs);

include/boost/decimal/decimal_fast32_t.hpp

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1073,12 +1073,28 @@ constexpr auto div_impl(const decimal_fast32_t lhs, const decimal_fast32_t rhs,
10731073
switch (lhs_fp)
10741074
{
10751075
case FP_INFINITE:
1076-
q = sign ? -inf : inf;
1077-
r = zero;
1076+
if (rhs_fp == FP_INFINITE)
1077+
{
1078+
q = nan;
1079+
r = nan;
1080+
}
1081+
else
1082+
{
1083+
q = sign ? -inf : inf;
1084+
r = zero;
1085+
}
10781086
return;
10791087
case FP_ZERO:
1080-
q = sign ? -zero : zero;
1081-
r = sign ? -zero : zero;
1088+
if (rhs_fp == FP_ZERO)
1089+
{
1090+
q = nan;
1091+
r = nan;
1092+
}
1093+
else
1094+
{
1095+
q = sign ? -zero : zero;
1096+
r = sign ? -zero : zero;
1097+
}
10821098
return;
10831099
default:
10841100
static_cast<void>(lhs);

include/boost/decimal/decimal_fast64_t.hpp

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1180,8 +1180,8 @@ constexpr auto d64_fast_div_impl(const decimal_fast64_t& lhs, const decimal_fast
11801180
#ifndef BOOST_DECIMAL_FAST_MATH
11811181
// Check pre-conditions
11821182
constexpr decimal_fast64_t zero {0, 0};
1183-
constexpr decimal_fast64_t nan {boost::decimal::direct_init_d64(boost::decimal::detail::d64_fast_snan, 0, false)};
1184-
constexpr decimal_fast64_t inf {boost::decimal::direct_init_d64(boost::decimal::detail::d64_fast_inf, 0, false)};
1183+
constexpr decimal_fast64_t nan {direct_init_d64(detail::d64_fast_qnan, 0, false)};
1184+
constexpr decimal_fast64_t inf {direct_init_d64(detail::d64_fast_inf, 0, false)};
11851185

11861186
const auto lhs_fp {fpclassify(lhs)};
11871187
const auto rhs_fp {fpclassify(rhs)};
@@ -1196,12 +1196,28 @@ constexpr auto d64_fast_div_impl(const decimal_fast64_t& lhs, const decimal_fast
11961196
switch (lhs_fp)
11971197
{
11981198
case FP_INFINITE:
1199-
q = sign ? -inf : inf;
1200-
r = zero;
1199+
if (rhs_fp == FP_INFINITE)
1200+
{
1201+
q = nan;
1202+
r = nan;
1203+
}
1204+
else
1205+
{
1206+
q = sign ? -inf : inf;
1207+
r = zero;
1208+
}
12011209
return;
12021210
case FP_ZERO:
1203-
q = sign ? -zero : zero;
1204-
r = sign ? -zero : zero;
1211+
if (rhs_fp == FP_ZERO)
1212+
{
1213+
q = nan;
1214+
r = nan;
1215+
}
1216+
else
1217+
{
1218+
q = sign ? -zero : zero;
1219+
r = sign ? -zero : zero;
1220+
}
12051221
return;
12061222
default:
12071223
static_cast<void>(lhs);

0 commit comments

Comments
 (0)