| 205 | } |
| 206 | |
| 207 | template<typename ArrayType> void array_real(const ArrayType& m) |
| 208 | { |
| 209 | using std::abs; |
| 210 | using std::sqrt; |
| 211 | typedef typename ArrayType::Index Index; |
| 212 | typedef typename ArrayType::Scalar Scalar; |
| 213 | typedef typename NumTraits<Scalar>::Real RealScalar; |
| 214 | |
| 215 | Index rows = m.rows(); |
| 216 | Index cols = m.cols(); |
| 217 | |
| 218 | ArrayType m1 = ArrayType::Random(rows, cols), |
| 219 | m2 = ArrayType::Random(rows, cols), |
| 220 | m3(rows, cols), |
| 221 | m4 = m1; |
| 222 | |
| 223 | m4 = (m4.abs()==Scalar(0)).select(1,m4); |
| 224 | |
| 225 | Scalar s1 = internal::random<Scalar>(); |
| 226 | |
| 227 | // these tests are mostly to check possible compilation issues with free-functions. |
| 228 | VERIFY_IS_APPROX(m1.sin(), sin(m1)); |
| 229 | VERIFY_IS_APPROX(m1.cos(), cos(m1)); |
| 230 | VERIFY_IS_APPROX(m1.tan(), tan(m1)); |
| 231 | VERIFY_IS_APPROX(m1.asin(), asin(m1)); |
| 232 | VERIFY_IS_APPROX(m1.acos(), acos(m1)); |
| 233 | VERIFY_IS_APPROX(m1.atan(), atan(m1)); |
| 234 | VERIFY_IS_APPROX(m1.sinh(), sinh(m1)); |
| 235 | VERIFY_IS_APPROX(m1.cosh(), cosh(m1)); |
| 236 | VERIFY_IS_APPROX(m1.tanh(), tanh(m1)); |
| 237 | |
| 238 | VERIFY_IS_APPROX(m1.arg(), arg(m1)); |
| 239 | VERIFY_IS_APPROX(m1.round(), round(m1)); |
| 240 | VERIFY_IS_APPROX(m1.floor(), floor(m1)); |
| 241 | VERIFY_IS_APPROX(m1.ceil(), ceil(m1)); |
| 242 | VERIFY((m1.isNaN() == (Eigen::isnan)(m1)).all()); |
| 243 | VERIFY((m1.isInf() == (Eigen::isinf)(m1)).all()); |
| 244 | VERIFY((m1.isFinite() == (Eigen::isfinite)(m1)).all()); |
| 245 | VERIFY_IS_APPROX(m1.inverse(), inverse(m1)); |
| 246 | VERIFY_IS_APPROX(m1.abs(), abs(m1)); |
| 247 | VERIFY_IS_APPROX(m1.abs2(), abs2(m1)); |
| 248 | VERIFY_IS_APPROX(m1.square(), square(m1)); |
| 249 | VERIFY_IS_APPROX(m1.cube(), cube(m1)); |
| 250 | VERIFY_IS_APPROX(cos(m1+RealScalar(3)*m2), cos((m1+RealScalar(3)*m2).eval())); |
| 251 | VERIFY_IS_APPROX(m1.sign(), sign(m1)); |
| 252 | |
| 253 | |
| 254 | // avoid NaNs with abs() so verification doesn't fail |
| 255 | m3 = m1.abs(); |
| 256 | VERIFY_IS_APPROX(m3.sqrt(), sqrt(abs(m1))); |
| 257 | VERIFY_IS_APPROX(m3.rsqrt(), Scalar(1)/sqrt(abs(m1))); |
| 258 | VERIFY_IS_APPROX(rsqrt(m3), Scalar(1)/sqrt(abs(m1))); |
| 259 | VERIFY_IS_APPROX(m3.log(), log(m3)); |
| 260 | VERIFY_IS_APPROX(m3.log1p(), log1p(m3)); |
| 261 | VERIFY_IS_APPROX(m3.log10(), log10(m3)); |
| 262 | |
| 263 | |
| 264 | VERIFY((!(m1>m2) == (m1<=m2)).all()); |