Skip to content

Commit 8dd52e5

Browse files
committed
Only calculate mod when not nan
1 parent ec0bda9 commit 8dd52e5

File tree

1 file changed

+51
-47
lines changed

1 file changed

+51
-47
lines changed

include/boost/decimal/decimal32_t.hpp

Lines changed: 51 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1922,57 +1922,57 @@ constexpr auto div_impl(const decimal32_t lhs, const decimal32_t rhs, decimal32_
19221922
{
19231923
return_nan = issignaling(lhs) ? nan_conversion(lhs) : lhs;
19241924
}
1925-
else
1926-
{
1927-
return_nan = issignaling(rhs) ? nan_conversion(rhs) : rhs;
1928-
}
1929-
1930-
q = return_nan;
1931-
r = return_nan;
1932-
1933-
return;
1934-
}
1935-
1936-
switch (lhs_fp)
1937-
{
1938-
case FP_INFINITE:
1939-
if (rhs_fp == FP_INFINITE)
1940-
{
1941-
q = nan;
1942-
r = nan;
1943-
}
19441925
else
19451926
{
1946-
q = sign ? -inf : inf;
1947-
r = zero;
1927+
return_nan = issignaling(rhs) ? nan_conversion(rhs) : rhs;
19481928
}
1949-
return;
1950-
case FP_ZERO:
1951-
if (rhs_fp == FP_ZERO)
1952-
{
1953-
q = nan;
1954-
r = nan;
1955-
}
1956-
else
1957-
{
1958-
q = sign ? -zero : zero;
1959-
r = sign ? -zero : zero;
1960-
}
1961-
return;
1962-
default:
1963-
static_cast<void>(lhs);
1964-
}
19651929

1966-
switch (rhs_fp)
1967-
{
1968-
case FP_ZERO:
1969-
q = inf;
1970-
r = zero;
1971-
return;
1972-
case FP_INFINITE:
1973-
q = sign ? -zero : zero;
1974-
r = lhs;
1930+
q = return_nan;
1931+
r = return_nan;
1932+
19751933
return;
1934+
}
1935+
1936+
switch (lhs_fp)
1937+
{
1938+
case FP_INFINITE:
1939+
if (rhs_fp == FP_INFINITE)
1940+
{
1941+
q = nan;
1942+
r = nan;
1943+
}
1944+
else
1945+
{
1946+
q = sign ? -inf : inf;
1947+
r = zero;
1948+
}
1949+
return;
1950+
case FP_ZERO:
1951+
if (rhs_fp == FP_ZERO)
1952+
{
1953+
q = nan;
1954+
r = nan;
1955+
}
1956+
else
1957+
{
1958+
q = sign ? -zero : zero;
1959+
r = sign ? -zero : zero;
1960+
}
1961+
return;
1962+
default:
1963+
static_cast<void>(lhs);
1964+
}
1965+
1966+
switch (rhs_fp)
1967+
{
1968+
case FP_ZERO:
1969+
q = inf;
1970+
r = zero;
1971+
return;
1972+
case FP_INFINITE:
1973+
q = sign ? -zero : zero;
1974+
r = lhs;
1975+
return;
19761976
default:
19771977
static_cast<void>(rhs);
19781978
}
@@ -2133,7 +2133,11 @@ constexpr auto operator%(const decimal32_t lhs, const decimal32_t rhs) noexcept
21332133
decimal32_t q {};
21342134
decimal32_t r {};
21352135
div_impl(lhs, rhs, q, r);
2136-
mod_impl(lhs, rhs, q, r);
2136+
2137+
if (BOOST_DECIMAL_LIKELY(!isnan(q)))
2138+
{
2139+
mod_impl(lhs, rhs, q, r);
2140+
}
21372141

21382142
return r;
21392143
}

0 commit comments

Comments
 (0)