| 759 | } |
| 760 | |
| 761 | template<typename ArrayType> void array_real(const ArrayType& m) |
| 762 | { |
| 763 | using numext::abs; |
| 764 | using std::sqrt; |
| 765 | typedef typename ArrayType::Scalar Scalar; |
| 766 | typedef typename NumTraits<Scalar>::Real RealScalar; |
| 767 | |
| 768 | Index rows = m.rows(); |
| 769 | Index cols = m.cols(); |
| 770 | |
| 771 | ArrayType m1 = ArrayType::Random(rows, cols), |
| 772 | m2 = ArrayType::Random(rows, cols), |
| 773 | m3(rows, cols), |
| 774 | m4 = m1; |
| 775 | |
| 776 | // avoid denormalized values so verification doesn't fail on platforms that don't support them |
| 777 | // denormalized behavior is tested elsewhere (unary_op_test, binary_ops_test) |
| 778 | const Scalar min = (std::numeric_limits<Scalar>::min)(); |
| 779 | m1 = (m1.abs()<min).select(Scalar(0),m1); |
| 780 | m2 = (m2.abs()<min).select(Scalar(0),m2); |
| 781 | m4 = (m4.abs()<min).select(Scalar(1),m4); |
| 782 | |
| 783 | Scalar s1 = internal::random<Scalar>(); |
| 784 | |
| 785 | // these tests are mostly to check possible compilation issues with free-functions. |
| 786 | VERIFY_IS_APPROX(m1.sin(), sin(m1)); |
| 787 | VERIFY_IS_APPROX(m1.cos(), cos(m1)); |
| 788 | VERIFY_IS_APPROX(m1.tan(), tan(m1)); |
| 789 | VERIFY_IS_APPROX(m1.asin(), asin(m1)); |
| 790 | VERIFY_IS_APPROX(m1.acos(), acos(m1)); |
| 791 | VERIFY_IS_APPROX(m1.atan(), atan(m1)); |
| 792 | VERIFY_IS_APPROX(m1.sinh(), sinh(m1)); |
| 793 | VERIFY_IS_APPROX(m1.cosh(), cosh(m1)); |
| 794 | VERIFY_IS_APPROX(m1.tanh(), tanh(m1)); |
| 795 | VERIFY_IS_APPROX(m1.atan2(m2), atan2(m1,m2)); |
| 796 | |
| 797 | VERIFY_IS_APPROX(m1.tanh().atanh(), atanh(tanh(m1))); |
| 798 | VERIFY_IS_APPROX(m1.sinh().asinh(), asinh(sinh(m1))); |
| 799 | VERIFY_IS_APPROX(m1.cosh().acosh(), acosh(cosh(m1))); |
| 800 | VERIFY_IS_APPROX(m1.tanh().atanh(), atanh(tanh(m1))); |
| 801 | VERIFY_IS_APPROX(m1.logistic(), logistic(m1)); |
| 802 | |
| 803 | VERIFY_IS_APPROX(m1.arg(), arg(m1)); |
| 804 | VERIFY_IS_APPROX(m1.round(), round(m1)); |
| 805 | VERIFY_IS_APPROX(m1.rint(), rint(m1)); |
| 806 | VERIFY_IS_APPROX(m1.floor(), floor(m1)); |
| 807 | VERIFY_IS_APPROX(m1.ceil(), ceil(m1)); |
| 808 | VERIFY((m1.isNaN() == (Eigen::isnan)(m1)).all()); |
| 809 | VERIFY((m1.isInf() == (Eigen::isinf)(m1)).all()); |
| 810 | VERIFY((m1.isFinite() == (Eigen::isfinite)(m1)).all()); |
| 811 | VERIFY_IS_APPROX(m4.inverse(), inverse(m4)); |
| 812 | VERIFY_IS_APPROX(m1.abs(), abs(m1)); |
| 813 | VERIFY_IS_APPROX(m1.abs2(), abs2(m1)); |
| 814 | VERIFY_IS_APPROX(m1.square(), square(m1)); |
| 815 | VERIFY_IS_APPROX(m1.cube(), cube(m1)); |
| 816 | VERIFY_IS_APPROX(cos(m1+RealScalar(3)*m2), cos((m1+RealScalar(3)*m2).eval())); |
| 817 | VERIFY_IS_APPROX(m1.sign(), sign(m1)); |
| 818 | VERIFY((m1.sqrt().sign().isNaN() == (Eigen::isnan)(sign(sqrt(m1)))).all()); |