exp_complex_test_impl< Scalar, Packet, HasExp > Struct Template Reference

Public Types

typedef Scalar::value_type RealScalar
 

Static Public Member Functions

static Scalar pexp1 (const Scalar &x)
 
static Scalar cis (const RealScalar &x)
 
static bool is_exactly_equal (RealScalar a, RealScalar b)
 
static bool is_exactly_equal (const Scalar &a, const Scalar &b)
 
static bool is_sign_exp_unspecified (const Scalar &z)
 
static void run (Scalar *data1, Scalar *data2, Scalar *ref, int size)
 

Member Typedef Documentation

◆ RealScalar

template<typename Scalar , typename Packet , bool HasExp = internal::packet_traits<Scalar>::HasExp>
typedef Scalar::value_type exp_complex_test_impl< Scalar, Packet, HasExp >::RealScalar

Member Function Documentation

◆ cis()

template<typename Scalar , typename Packet , bool HasExp = internal::packet_traits<Scalar>::HasExp>
static Scalar exp_complex_test_impl< Scalar, Packet, HasExp >::cis ( const RealScalar x)
inlinestatic
1391 { return Scalar(numext::cos(x), numext::sin(x)); }
AnnoyingScalar cos(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:136
AnnoyingScalar sin(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:137
SCALAR Scalar
Definition: bench_gemm.cpp:45
list x
Definition: plotDoE.py:28

References cos(), sin(), and plotDoE::x.

◆ is_exactly_equal() [1/2]

template<typename Scalar , typename Packet , bool HasExp = internal::packet_traits<Scalar>::HasExp>
static bool exp_complex_test_impl< Scalar, Packet, HasExp >::is_exactly_equal ( const Scalar a,
const Scalar b 
)
inlinestatic
1422  {
1425  if (!result) {
1426  std::cout << a << " != " << b << std::endl;
1427  }
1428  return result;
1429  }
Scalar * b
Definition: benchVecAdd.cpp:17
const Scalar * a
Definition: level2_cplx_impl.h:32
EIGEN_DEVICE_FUNC internal::add_const_on_value_type_t< EIGEN_MATHFUNC_RETVAL(imag_ref, Scalar)> imag_ref(const Scalar &x)
Definition: MathFunctions.h:1072
EIGEN_DEVICE_FUNC internal::add_const_on_value_type_t< EIGEN_MATHFUNC_RETVAL(real_ref, Scalar)> real_ref(const Scalar &x)
Definition: MathFunctions.h:1051
static bool is_exactly_equal(RealScalar a, RealScalar b)
Definition: packetmath.cpp:1394

References a, b, Eigen::numext::imag_ref(), exp_complex_test_impl< Scalar, Packet, HasExp >::is_exactly_equal(), and Eigen::numext::real_ref().

◆ is_exactly_equal() [2/2]

template<typename Scalar , typename Packet , bool HasExp = internal::packet_traits<Scalar>::HasExp>
static bool exp_complex_test_impl< Scalar, Packet, HasExp >::is_exactly_equal ( RealScalar  a,
RealScalar  b 
)
inlinestatic
1394  {
1395  // NaNs are always unsigned, and always compare not equal directly.
1396  if ((numext::isnan)(a)) {
1397  return (numext::isnan)(b);
1398  }
1399 
1400  RealScalar zero(0);
1401 #ifdef EIGEN_ARCH_ARM
1402  // ARM automatically flushes denormals to zero.
1403  // Preserve sign by multiplying by +0.
1405  a = a * zero;
1406  }
1408  b = b * zero;
1409  }
1410 #endif
1411 
1412  // Signed zero.
1413  if (a == zero) {
1414  // Signs are either 0 or NaN, so verify that their comparisons to zero are equal.
1415  return (a == b) && ((numext::signbit(a) == zero) == (numext::signbit(b) == zero));
1416  }
1417  // Allow _some_ tolerance.
1418  return verifyIsApprox(a, b);
1419  }
AnnoyingScalar abs(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:135
NumTraits< Scalar >::Real RealScalar
Definition: bench_gemm.cpp:46
#define min(a, b)
Definition: datatypes.h:22
#define isnan(X)
Definition: main.h:109
EIGEN_DEVICE_FUNC static constexpr EIGEN_ALWAYS_INLINE Scalar signbit(const Scalar &x)
Definition: MathFunctions.h:1419
bool verifyIsApprox(const Type1 &a, const Type2 &b)
Definition: main.h:609
EIGEN_DONT_INLINE Scalar zero()
Definition: svd_common.h:232

References a, abs(), b, isnan, min, Eigen::numext::signbit(), Eigen::verifyIsApprox(), and zero().

Referenced by exp_complex_test_impl< Scalar, Packet, HasExp >::is_exactly_equal(), and exp_complex_test_impl< Scalar, Packet, HasExp >::run().

◆ is_sign_exp_unspecified()

template<typename Scalar , typename Packet , bool HasExp = internal::packet_traits<Scalar>::HasExp>
static bool exp_complex_test_impl< Scalar, Packet, HasExp >::is_sign_exp_unspecified ( const Scalar z)
inlinestatic
1431  {
1432  const RealScalar inf = std::numeric_limits<RealScalar>::infinity();
1433  // If z is (-∞,±∞), the result is (±0,±0) (signs are unspecified)
1434  if (numext::real_ref(z) == -inf && (numext::isinf)(numext::imag_ref(z))) {
1435  return true;
1436  }
1437  // If z is (+∞,±∞), the result is (±∞,NaN) and FE_INVALID is raised (the sign of the real part is unspecified)
1438  if (numext::real_ref(z) == +inf && (numext::isinf)(numext::imag_ref(z))) {
1439  return true;
1440  }
1441  // If z is (-∞,NaN), the result is (±0,±0) (signs are unspecified)
1442  if (numext::real_ref(z) == -inf && (numext::isnan)(numext::imag_ref(z))) {
1443  return true;
1444  }
1445  // If z is (+∞,NaN), the result is (±∞,NaN) (the sign of the real part is unspecified)
1446  if (numext::real_ref(z) == +inf && (numext::isnan)(numext::imag_ref(z))) {
1447  return true;
1448  }
1449  return false;
1450  }
#define isinf(X)
Definition: main.h:110
const Mdouble inf
Definition: GeneralDefine.h:23

References Eigen::numext::imag_ref(), constants::inf, isinf, isnan, and Eigen::numext::real_ref().

Referenced by exp_complex_test_impl< Scalar, Packet, HasExp >::run().

◆ pexp1()

template<typename Scalar , typename Packet , bool HasExp = internal::packet_traits<Scalar>::HasExp>
static Scalar exp_complex_test_impl< Scalar, Packet, HasExp >::pexp1 ( const Scalar x)
inlinestatic
1385  {
1386  Packet px = internal::pset1<Packet>(x);
1388  return internal::pfirst(py);
1389  }
RealScalar RealScalar * px
Definition: level1_cplx_impl.h:27
int RealScalar int RealScalar * py
Definition: level1_cplx_impl.h:124
EIGEN_STRONG_INLINE bfloat16 pfirst(const Packet8bf &a)
Definition: AltiVec/PacketMath.h:2418
EIGEN_STRONG_INLINE Packet4f pexp(const Packet4f &_x)
Definition: LSX/PacketMath.h:2663

References Eigen::internal::pexp(), Eigen::internal::pfirst(), px, py, and plotDoE::x.

Referenced by exp_complex_test_impl< Scalar, Packet, HasExp >::run().

◆ run()

template<typename Scalar , typename Packet , bool HasExp = internal::packet_traits<Scalar>::HasExp>
static void exp_complex_test_impl< Scalar, Packet, HasExp >::run ( Scalar data1,
Scalar data2,
Scalar ref,
int  size 
)
inlinestatic
1452  {
1453  const int PacketSize = internal::unpacket_traits<Packet>::size;
1454 
1455  for (int i = 0; i < size; ++i) {
1456  data1[i] = Scalar(internal::random<RealScalar>(), internal::random<RealScalar>());
1457  }
1459 
1460  // Test all corner cases (and more).
1461  const RealScalar edges[] = {RealScalar(0),
1462  RealScalar(1),
1463  RealScalar(2),
1464  RealScalar(EIGEN_PI / 2),
1466  RealScalar(3 * EIGEN_PI / 2),
1467  RealScalar(2 * EIGEN_PI),
1470  std::numeric_limits<RealScalar>::infinity(),
1471  std::numeric_limits<RealScalar>::quiet_NaN(),
1472  -RealScalar(0),
1473  -RealScalar(1),
1474  -RealScalar(2),
1475  -RealScalar(EIGEN_PI / 2),
1476  -RealScalar(EIGEN_PI),
1477  -RealScalar(3 * EIGEN_PI / 2),
1478  -RealScalar(2 * EIGEN_PI),
1481  -std::numeric_limits<RealScalar>::infinity(),
1482  -std::numeric_limits<RealScalar>::quiet_NaN()};
1483 
1484  for (RealScalar x : edges) {
1485  for (RealScalar y : edges) {
1486  Scalar z = Scalar(x, y);
1487  Scalar w = pexp1(z);
1488  if (is_sign_exp_unspecified(z)) {
1490  Scalar expected = numext::exp(z);
1491  Scalar abs_expected =
1493  VERIFY(is_exactly_equal(abs_w, abs_expected));
1494  } else {
1496  }
1497  }
1498  }
1499  }
int i
Definition: BiCGSTAB_step_by_step.cpp:9
#define EIGEN_PI
Definition: MathFunctions.h:16
RowVector3d w
Definition: Matrix_resize_int.cpp:3
Scalar Scalar int size
Definition: benchVecAdd.cpp:17
Scalar * y
Definition: level1_cplx_impl.h:128
#define VERIFY(a)
Definition: main.h:362
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 exp(const bfloat16 &a)
Definition: BFloat16.h:615
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 log(const bfloat16 &a)
Definition: BFloat16.h:618
#define CHECK_CWISE1_N(REFOP, POP, N)
Definition: packetmath_test_shared.h:121
Holds information about the various numeric (i.e. scalar) types allowed by Eigen.
Definition: NumTraits.h:217
Scalar::value_type RealScalar
Definition: packetmath.cpp:1383
static bool is_sign_exp_unspecified(const Scalar &z)
Definition: packetmath.cpp:1431
static Scalar pexp1(const Scalar &x)
Definition: packetmath.cpp:1385

References abs(), CHECK_CWISE1_N, EIGEN_PI, Eigen::bfloat16_impl::exp(), i, Eigen::numext::imag_ref(), exp_complex_test_impl< Scalar, Packet, HasExp >::is_exactly_equal(), exp_complex_test_impl< Scalar, Packet, HasExp >::is_sign_exp_unspecified(), Eigen::bfloat16_impl::log(), Eigen::internal::pexp(), exp_complex_test_impl< Scalar, Packet, HasExp >::pexp1(), Eigen::numext::real_ref(), size, VERIFY, w, plotDoE::x, and y.

Referenced by exp_complex_test().


The documentation for this struct was generated from the following file: