Skip to content

Commit a001179

Browse files
committed
Simplify logarithmic functions
1 parent b9c37b7 commit a001179

File tree

2 files changed

+15
-41
lines changed

2 files changed

+15
-41
lines changed

include/boost/decimal/detail/cmath/log.hpp

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,22 +28,15 @@ constexpr auto log(T x) noexcept
2828
constexpr T zero { 0, 0 };
2929
constexpr T one { 1, 0 };
3030

31-
auto result = zero;
31+
T result { };
3232

3333
if (isnan(x))
3434
{
3535
result = x;
3636
}
3737
else if (isinf(x))
3838
{
39-
if (!signbit(x))
40-
{
41-
result = x;
42-
}
43-
else
44-
{
45-
result = std::numeric_limits<T>::quiet_NaN();
46-
}
39+
result = (!signbit(x)) ? x: std::numeric_limits<T>::quiet_NaN();
4740
}
4841
else if (x < one)
4942
{
@@ -85,8 +78,7 @@ constexpr auto log(T x) noexcept
8578
const auto z = s + s;
8679
const auto zsq = z * z;
8780

88-
result = detail::log_series_expansion(zsq);
89-
result = z * fma(result, zsq, one);
81+
result = z * fma(detail::log_series_expansion(zsq), zsq, one);
9082

9183
if (exp2val > 0)
9284
{

include/boost/decimal/detail/cmath/log1p.hpp

Lines changed: 12 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -25,45 +25,29 @@ BOOST_DECIMAL_EXPORT template <typename T>
2525
constexpr auto log1p(T x) noexcept
2626
BOOST_DECIMAL_REQUIRES(detail::is_decimal_floating_point_v, T)
2727
{
28-
const auto fpc = fpclassify(x);
28+
constexpr T one { 1, 0 };
2929

30-
constexpr T zero { 0, 0 };
31-
constexpr T one { 1, 0 };
30+
T result { };
3231

33-
auto result = zero;
32+
const auto fpc = fpclassify(x);
3433

3534
if (fpc == FP_ZERO)
3635
{
3736
result = x;
3837
}
3938
else if (fpc != FP_NORMAL)
4039
{
41-
if (fpc == FP_INFINITE)
42-
{
43-
if (signbit(x))
44-
{
45-
result = std::numeric_limits<T>::quiet_NaN();
46-
}
47-
else
48-
{
49-
result = x;
50-
}
51-
}
52-
else if (fpc == FP_NAN)
53-
{
54-
result = x;
55-
}
40+
result =
41+
(
42+
((fpc == FP_INFINITE) && signbit(x)) ? std::numeric_limits<T>::quiet_NaN() : x
43+
);
5644
}
5745
else if (-x >= one)
5846
{
59-
if (-x == one)
60-
{
61-
result = -std::numeric_limits<T>::infinity();
62-
}
63-
else
64-
{
65-
result = std::numeric_limits<T>::quiet_NaN();
66-
}
47+
result =
48+
(
49+
(-x == one) ? -std::numeric_limits<T>::infinity() : std::numeric_limits<T>::quiet_NaN()
50+
);
6751
}
6852
else
6953
{
@@ -73,9 +57,7 @@ constexpr auto log1p(T x) noexcept
7357
}
7458
else
7559
{
76-
result = detail::log1p_series_expansion(x);
77-
result = fma(result, x, one);
78-
result *= x;
60+
result = x * fma(detail::log1p_series_expansion(x), x, one);
7961
}
8062
}
8163

0 commit comments

Comments
 (0)