| 326 | } |
| 327 | |
| 328 | template<typename Scalar> void packetmath_real() |
| 329 | { |
| 330 | using std::abs; |
| 331 | typedef internal::packet_traits<Scalar> PacketTraits; |
| 332 | typedef typename PacketTraits::type Packet; |
| 333 | const int PacketSize = PacketTraits::size; |
| 334 | |
| 335 | const int size = PacketSize*4; |
| 336 | EIGEN_ALIGN_MAX Scalar data1[PacketTraits::size*4]; |
| 337 | EIGEN_ALIGN_MAX Scalar data2[PacketTraits::size*4]; |
| 338 | EIGEN_ALIGN_MAX Scalar ref[PacketTraits::size*4]; |
| 339 | |
| 340 | for (int i=0; i<size; ++i) |
| 341 | { |
| 342 | data1[i] = internal::random<Scalar>(-1,1) * std::pow(Scalar(10), internal::random<Scalar>(-3,3)); |
| 343 | data2[i] = internal::random<Scalar>(-1,1) * std::pow(Scalar(10), internal::random<Scalar>(-3,3)); |
| 344 | } |
| 345 | CHECK_CWISE1_IF(PacketTraits::HasSin, std::sin, internal::psin); |
| 346 | CHECK_CWISE1_IF(PacketTraits::HasCos, std::cos, internal::pcos); |
| 347 | CHECK_CWISE1_IF(PacketTraits::HasTan, std::tan, internal::ptan); |
| 348 | |
| 349 | CHECK_CWISE1_IF(PacketTraits::HasRound, numext::round, internal::pround); |
| 350 | CHECK_CWISE1_IF(PacketTraits::HasCeil, numext::ceil, internal::pceil); |
| 351 | CHECK_CWISE1_IF(PacketTraits::HasFloor, numext::floor, internal::pfloor); |
| 352 | |
| 353 | for (int i=0; i<size; ++i) |
| 354 | { |
| 355 | data1[i] = internal::random<Scalar>(-1,1); |
| 356 | data2[i] = internal::random<Scalar>(-1,1); |
| 357 | } |
| 358 | CHECK_CWISE1_IF(PacketTraits::HasASin, std::asin, internal::pasin); |
| 359 | CHECK_CWISE1_IF(PacketTraits::HasACos, std::acos, internal::pacos); |
| 360 | |
| 361 | for (int i=0; i<size; ++i) |
| 362 | { |
| 363 | data1[i] = internal::random<Scalar>(-87,88); |
| 364 | data2[i] = internal::random<Scalar>(-87,88); |
| 365 | } |
| 366 | CHECK_CWISE1_IF(PacketTraits::HasExp, std::exp, internal::pexp); |
| 367 | for (int i=0; i<size; ++i) |
| 368 | { |
| 369 | data1[i] = internal::random<Scalar>(-1,1) * std::pow(Scalar(10), internal::random<Scalar>(-6,6)); |
| 370 | data2[i] = internal::random<Scalar>(-1,1) * std::pow(Scalar(10), internal::random<Scalar>(-6,6)); |
| 371 | } |
| 372 | CHECK_CWISE1_IF(PacketTraits::HasTanh, std::tanh, internal::ptanh); |
| 373 | if(PacketTraits::HasExp && PacketTraits::size>=2) |
| 374 | { |
| 375 | data1[0] = std::numeric_limits<Scalar>::quiet_NaN(); |
| 376 | data1[1] = std::numeric_limits<Scalar>::epsilon(); |
| 377 | packet_helper<PacketTraits::HasExp,Packet> h; |
| 378 | h.store(data2, internal::pexp(h.load(data1))); |
| 379 | VERIFY((numext::isnan)(data2[0])); |
| 380 | VERIFY_IS_EQUAL(std::exp(std::numeric_limits<Scalar>::epsilon()), data2[1]); |
| 381 | |
| 382 | data1[0] = -std::numeric_limits<Scalar>::epsilon(); |
| 383 | data1[1] = 0; |
| 384 | h.store(data2, internal::pexp(h.load(data1))); |
| 385 | VERIFY_IS_EQUAL(std::exp(-std::numeric_limits<Scalar>::epsilon()), data2[0]); |
nothing calls this directly
no test coverage detected