Eigen::internal::accurate_log2< float > Struct Reference

#include <GenericPacketMathFunctions.h>

Public Member Functions

template<typename Packet >
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void operator() (const Packet &z, Packet &log2_x_hi, Packet &log2_x_lo)
 

Member Function Documentation

◆ operator()()

template<typename Packet >
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void Eigen::internal::accurate_log2< float >::operator() ( const Packet z,
Packet log2_x_hi,
Packet log2_x_lo 
)
inline
1854  {
1855  // Split the two lowest order constant coefficient into double-word representation.
1856  constexpr double kC0 = 1.442695041742110273474963832995854318141937255859375e+00;
1857  constexpr float kC0_hi = static_cast<float>(kC0);
1858  constexpr float kC0_lo = static_cast<float>(kC0 - static_cast<double>(kC0_hi));
1859  const Packet c0_hi = pset1<Packet>(kC0_hi);
1860  const Packet c0_lo = pset1<Packet>(kC0_lo);
1861 
1862  constexpr double kC1 = -7.2134751588268664068692714863573201000690460205078125e-01;
1863  constexpr float kC1_hi = static_cast<float>(kC1);
1864  constexpr float kC1_lo = static_cast<float>(kC1 - static_cast<double>(kC1_hi));
1865  const Packet c1_hi = pset1<Packet>(kC1_hi);
1866  const Packet c1_lo = pset1<Packet>(kC1_lo);
1867 
1868  constexpr float c[] = {
1869  9.7010828554630279541015625e-02, -1.6896486282348632812500000e-01, 1.7200836539268493652343750e-01,
1870  -1.7892272770404815673828125e-01, 2.0505344867706298828125000e-01, -2.4046677350997924804687500e-01,
1871  2.8857553005218505859375000e-01, -3.6067414283752441406250000e-01, 4.8089790344238281250000000e-01};
1872 
1873  // Evaluate the higher order terms in the polynomial using
1874  // standard arithmetic.
1875  const Packet one = pset1<Packet>(1.0f);
1876  const Packet x = psub(z, one);
1878  // Evaluate the final two step in Horner's rule using double-word
1879  // arithmetic.
1880  Packet p_hi, p_lo;
1881  twoprod(x, p, p_hi, p_lo);
1882  fast_twosum(c1_hi, c1_lo, p_hi, p_lo, p_hi, p_lo);
1883  twoprod(p_hi, p_lo, x, p_hi, p_lo);
1884  fast_twosum(c0_hi, c0_lo, p_hi, p_lo, p_hi, p_lo);
1885  // Multiply by x to recover log2(z).
1886  twoprod(p_hi, p_lo, x, log2_x_hi, log2_x_lo);
1887  }
float * p
Definition: Tutorial_Map_using.cpp:9
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void fast_twosum(const Packet &x, const Packet &y, Packet &s_hi, Packet &s_lo)
Definition: GenericPacketMathFunctions.h:1654
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void twoprod(const Packet &x, const Packet &y, Packet &p_hi, Packet &p_lo)
Definition: GenericPacketMathFunctions.h:1701
EIGEN_DEVICE_FUNC Packet psub(const Packet &a, const Packet &b)
Definition: GenericPacketMath.h:337
int c
Definition: calibrate.py:100
list x
Definition: plotDoE.py:28
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet run(const Packet &x, const typename unpacket_traits< Packet >::type coeff[])
Definition: GenericPacketMathFunctions.h:86

References calibrate::c, Eigen::internal::fast_twosum(), p, Eigen::internal::psub(), Eigen::internal::ppolevl< Packet, N >::run(), Eigen::internal::twoprod(), and plotDoE::x.


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