| 152 | } |
| 153 | |
| 154 | template<typename ArrayType> void array_real(const ArrayType& m) |
| 155 | { |
| 156 | using std::abs; |
| 157 | using std::sqrt; |
| 158 | typedef typename ArrayType::Index Index; |
| 159 | typedef typename ArrayType::Scalar Scalar; |
| 160 | typedef typename NumTraits<Scalar>::Real RealScalar; |
| 161 | |
| 162 | Index rows = m.rows(); |
| 163 | Index cols = m.cols(); |
| 164 | |
| 165 | ArrayType m1 = ArrayType::Random(rows, cols), |
| 166 | m2 = ArrayType::Random(rows, cols), |
| 167 | m3(rows, cols); |
| 168 | |
| 169 | Scalar s1 = internal::random<Scalar>(); |
| 170 | |
| 171 | // these tests are mostly to check possible compilation issues. |
| 172 | VERIFY_IS_APPROX(m1.sin(), sin(m1)); |
| 173 | VERIFY_IS_APPROX(m1.cos(), cos(m1)); |
| 174 | VERIFY_IS_APPROX(m1.asin(), asin(m1)); |
| 175 | VERIFY_IS_APPROX(m1.acos(), acos(m1)); |
| 176 | VERIFY_IS_APPROX(m1.tan(), tan(m1)); |
| 177 | |
| 178 | VERIFY_IS_APPROX(cos(m1+RealScalar(3)*m2), cos((m1+RealScalar(3)*m2).eval())); |
| 179 | |
| 180 | VERIFY_IS_APPROX(m1.abs().sqrt(), sqrt(abs(m1))); |
| 181 | VERIFY_IS_APPROX(m1.abs(), sqrt(numext::abs2(m1))); |
| 182 | |
| 183 | VERIFY_IS_APPROX(numext::abs2(numext::real(m1)) + numext::abs2(numext::imag(m1)), numext::abs2(m1)); |
| 184 | VERIFY_IS_APPROX(numext::abs2(real(m1)) + numext::abs2(imag(m1)), numext::abs2(m1)); |
| 185 | if(!NumTraits<Scalar>::IsComplex) |
| 186 | VERIFY_IS_APPROX(numext::real(m1), m1); |
| 187 | |
| 188 | // shift argument of logarithm so that it is not zero |
| 189 | Scalar smallNumber = NumTraits<Scalar>::dummy_precision(); |
| 190 | VERIFY_IS_APPROX((m1.abs() + smallNumber).log() , log(abs(m1) + smallNumber)); |
| 191 | |
| 192 | VERIFY_IS_APPROX(m1.exp() * m2.exp(), exp(m1+m2)); |
| 193 | VERIFY_IS_APPROX(m1.exp(), exp(m1)); |
| 194 | VERIFY_IS_APPROX(m1.exp() / m2.exp(),(m1-m2).exp()); |
| 195 | |
| 196 | VERIFY_IS_APPROX(m1.pow(2), m1.square()); |
| 197 | VERIFY_IS_APPROX(pow(m1,2), m1.square()); |
| 198 | |
| 199 | ArrayType exponents = ArrayType::Constant(rows, cols, RealScalar(2)); |
| 200 | VERIFY_IS_APPROX(Eigen::pow(m1,exponents), m1.square()); |
| 201 | |
| 202 | m3 = m1.abs(); |
| 203 | VERIFY_IS_APPROX(m3.pow(RealScalar(0.5)), m3.sqrt()); |
| 204 | VERIFY_IS_APPROX(pow(m3,RealScalar(0.5)), m3.sqrt()); |
| 205 | |
| 206 | // scalar by array division |
| 207 | const RealScalar tiny = sqrt(std::numeric_limits<RealScalar>::epsilon()); |
| 208 | s1 += Scalar(tiny); |
| 209 | m1 += ArrayType::Constant(rows,cols,Scalar(tiny)); |
| 210 | VERIFY_IS_APPROX(s1/m1, s1 * m1.inverse()); |
| 211 |
no test coverage detected