| 332 | } |
| 333 | |
| 334 | template<typename ArrayType> void array_real(const ArrayType& m) |
| 335 | { |
| 336 | using std::abs; |
| 337 | using std::sqrt; |
| 338 | typedef typename ArrayType::Scalar Scalar; |
| 339 | typedef typename NumTraits<Scalar>::Real RealScalar; |
| 340 | |
| 341 | Index rows = m.rows(); |
| 342 | Index cols = m.cols(); |
| 343 | |
| 344 | ArrayType m1 = ArrayType::Random(rows, cols), |
| 345 | m2 = ArrayType::Random(rows, cols), |
| 346 | m3(rows, cols), |
| 347 | m4 = m1; |
| 348 | |
| 349 | m4 = (m4.abs()==Scalar(0)).select(Scalar(1),m4); |
| 350 | |
| 351 | Scalar s1 = internal::random<Scalar>(); |
| 352 | |
| 353 | // these tests are mostly to check possible compilation issues with free-functions. |
| 354 | VERIFY_IS_APPROX(m1.sin(), sin(m1)); |
| 355 | VERIFY_IS_APPROX(m1.cos(), cos(m1)); |
| 356 | VERIFY_IS_APPROX(m1.tan(), tan(m1)); |
| 357 | VERIFY_IS_APPROX(m1.asin(), asin(m1)); |
| 358 | VERIFY_IS_APPROX(m1.acos(), acos(m1)); |
| 359 | VERIFY_IS_APPROX(m1.atan(), atan(m1)); |
| 360 | VERIFY_IS_APPROX(m1.sinh(), sinh(m1)); |
| 361 | VERIFY_IS_APPROX(m1.cosh(), cosh(m1)); |
| 362 | VERIFY_IS_APPROX(m1.tanh(), tanh(m1)); |
| 363 | #if EIGEN_HAS_CXX11_MATH |
| 364 | VERIFY_IS_APPROX(m1.tanh().atanh(), atanh(tanh(m1))); |
| 365 | VERIFY_IS_APPROX(m1.sinh().asinh(), asinh(sinh(m1))); |
| 366 | VERIFY_IS_APPROX(m1.cosh().acosh(), acosh(cosh(m1))); |
| 367 | #endif |
| 368 | VERIFY_IS_APPROX(m1.logistic(), logistic(m1)); |
| 369 | |
| 370 | VERIFY_IS_APPROX(m1.arg(), arg(m1)); |
| 371 | VERIFY_IS_APPROX(m1.round(), round(m1)); |
| 372 | VERIFY_IS_APPROX(m1.rint(), rint(m1)); |
| 373 | VERIFY_IS_APPROX(m1.floor(), floor(m1)); |
| 374 | VERIFY_IS_APPROX(m1.ceil(), ceil(m1)); |
| 375 | VERIFY((m1.isNaN() == (Eigen::isnan)(m1)).all()); |
| 376 | VERIFY((m1.isInf() == (Eigen::isinf)(m1)).all()); |
| 377 | VERIFY((m1.isFinite() == (Eigen::isfinite)(m1)).all()); |
| 378 | VERIFY_IS_APPROX(m4.inverse(), inverse(m4)); |
| 379 | VERIFY_IS_APPROX(m1.abs(), abs(m1)); |
| 380 | VERIFY_IS_APPROX(m1.abs2(), abs2(m1)); |
| 381 | VERIFY_IS_APPROX(m1.square(), square(m1)); |
| 382 | VERIFY_IS_APPROX(m1.cube(), cube(m1)); |
| 383 | VERIFY_IS_APPROX(cos(m1+RealScalar(3)*m2), cos((m1+RealScalar(3)*m2).eval())); |
| 384 | VERIFY_IS_APPROX(m1.sign(), sign(m1)); |
| 385 | VERIFY((m1.sqrt().sign().isNaN() == (Eigen::isnan)(sign(sqrt(m1)))).all()); |
| 386 | |
| 387 | // avoid inf and NaNs so verification doesn't fail |
| 388 | m3 = m4.abs(); |
| 389 | VERIFY_IS_APPROX(m3.sqrt(), sqrt(abs(m3))); |
| 390 | VERIFY_IS_APPROX(m3.rsqrt(), Scalar(1)/sqrt(abs(m3))); |
| 391 | VERIFY_IS_APPROX(rsqrt(m3), Scalar(1)/sqrt(abs(m3))); |