mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-04-12 19:20:36 +08:00
Fix bug for atanh(-1).
This commit is contained in:
parent
66927f7807
commit
f33af052e0
@ -1222,8 +1222,10 @@ EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet patanh_float(const Pa
|
||||
const Packet x_gt_half = pcmp_le(half, pabs(x));
|
||||
const Packet x_eq_one = pcmp_eq(one, pabs(x));
|
||||
const Packet x_gt_one = pcmp_lt(one, pabs(x));
|
||||
const Packet sign_mask = pset1<Packet>(-1.0f);
|
||||
const Packet x_sign = pand(sign_mask, x);
|
||||
const Packet inf = pset1<Packet>(std::numeric_limits<float>::infinity());
|
||||
return por(x_gt_one, pselect(x_eq_one, por(psignbit(x), inf), pselect(x_gt_half, r, p)));
|
||||
return por(x_gt_one, pselect(x_eq_one, por(x_sign, inf), pselect(x_gt_half, r, p)));
|
||||
}
|
||||
|
||||
template <typename Packet>
|
||||
@ -1267,8 +1269,10 @@ EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet patanh_double(const P
|
||||
const Packet x_gt_half = pcmp_le(half, pabs(x));
|
||||
const Packet x_eq_one = pcmp_eq(one, pabs(x));
|
||||
const Packet x_gt_one = pcmp_lt(one, pabs(x));
|
||||
const Packet sign_mask = pset1<Packet>(-1.0);
|
||||
const Packet x_sign = pand(sign_mask, x);
|
||||
const Packet inf = pset1<Packet>(std::numeric_limits<double>::infinity());
|
||||
return por(x_gt_one, pselect(x_eq_one, por(psignbit(x), inf), pselect(x_gt_half, y_large, y_small)));
|
||||
return por(x_gt_one, pselect(x_eq_one, por(x_sign, inf), pselect(x_gt_half, y_large, y_small)));
|
||||
}
|
||||
|
||||
template <typename Packet>
|
||||
|
@ -52,34 +52,32 @@ std::vector<Scalar> special_values() {
|
||||
const Scalar min = (std::numeric_limits<Scalar>::min)();
|
||||
const Scalar max = (std::numeric_limits<Scalar>::max)();
|
||||
const Scalar max_exp = (static_cast<Scalar>(int(Eigen::NumTraits<Scalar>::max_exponent())) * Scalar(EIGEN_LN2)) / eps;
|
||||
return {zero, denorm_min, min, eps, sqrt_half, one_half, one, sqrt2, two, three, max_exp, max, inf, nan};
|
||||
std::vector<Scalar> values = {zero, denorm_min, min, eps, sqrt_half, one_half, one,
|
||||
sqrt2, two, three, max_exp, max, inf, nan};
|
||||
std::vector<Scalar> signed_values;
|
||||
for (Scalar value : values) {
|
||||
signed_values.push_back(value);
|
||||
signed_values.push_back(-value);
|
||||
}
|
||||
return signed_values;
|
||||
}
|
||||
|
||||
template <typename Scalar>
|
||||
void special_value_pairs(Array<Scalar, Dynamic, Dynamic>& x, Array<Scalar, Dynamic, Dynamic>& y) {
|
||||
std::vector<Scalar> abs_vals = special_values<Scalar>();
|
||||
const Index abs_cases = (Index)abs_vals.size();
|
||||
const Index num_cases = 2 * abs_cases * 2 * abs_cases;
|
||||
std::vector<Scalar> vals = special_values<Scalar>();
|
||||
int num_cases = vals.size() * vals.size();
|
||||
// ensure both vectorized and non-vectorized paths taken
|
||||
const Index num_repeats = 2 * (Index)internal::packet_traits<Scalar>::size + 1;
|
||||
x.resize(num_repeats, num_cases);
|
||||
y.resize(num_repeats, num_cases);
|
||||
int count = 0;
|
||||
for (Index i = 0; i < abs_cases; ++i) {
|
||||
const Scalar abs_x = abs_vals[i];
|
||||
for (Index sign_x = 0; sign_x < 2; ++sign_x) {
|
||||
Scalar x_case = sign_x == 0 ? -abs_x : abs_x;
|
||||
for (Index j = 0; j < abs_cases; ++j) {
|
||||
const Scalar abs_y = abs_vals[j];
|
||||
for (Index sign_y = 0; sign_y < 2; ++sign_y) {
|
||||
Scalar y_case = sign_y == 0 ? -abs_y : abs_y;
|
||||
for (Index repeat = 0; repeat < num_repeats; ++repeat) {
|
||||
x(repeat, count) = x_case;
|
||||
y(repeat, count) = y_case;
|
||||
}
|
||||
++count;
|
||||
}
|
||||
for (const Scalar x_case : vals) {
|
||||
for (const Scalar y_case : vals) {
|
||||
for (Index repeat = 0; repeat < num_repeats; ++repeat) {
|
||||
x(repeat, count) = x_case;
|
||||
y(repeat, count) = y_case;
|
||||
}
|
||||
++count;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user