Fixes #2735: Component-wise cbrt
This commit is contained in:
		
							parent
							
								
									48b254a4bc
								
							
						
					
					
						commit
						5de0f2f89e
					
				| @ -140,6 +140,7 @@ EIGEN_MKL_VML_DECLARE_UNARY_CALLS_CPLX(arg, Arg,      _) | |||||||
| EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(round, Round,  _) | EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(round, Round,  _) | ||||||
| EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(floor, Floor,  _) | EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(floor, Floor,  _) | ||||||
| EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(ceil,  Ceil,   _) | EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(ceil,  Ceil,   _) | ||||||
|  | EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(cbrt,  Cbrt,  _) | ||||||
| 
 | 
 | ||||||
| #define EIGEN_MKL_VML_DECLARE_POW_CALL(EIGENOP, VMLOP, EIGENTYPE, VMLTYPE, VMLMODE)                                           \ | #define EIGEN_MKL_VML_DECLARE_POW_CALL(EIGENOP, VMLOP, EIGENTYPE, VMLTYPE, VMLMODE)                                           \ | ||||||
|   template< typename DstXprType, typename SrcXprNested, typename Plain>                                                       \ |   template< typename DstXprType, typename SrcXprNested, typename Plain>                                                       \ | ||||||
|  | |||||||
| @ -1017,6 +1017,10 @@ Packet plog2(const Packet& a) { | |||||||
| template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS | template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS | ||||||
| Packet psqrt(const Packet& a) { return numext::sqrt(a); } | Packet psqrt(const Packet& a) { return numext::sqrt(a); } | ||||||
| 
 | 
 | ||||||
|  | /** \internal \returns the cube-root of \a a (coeff-wise) */ | ||||||
|  | template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS | ||||||
|  | Packet pcbrt(const Packet& a) { return numext::cbrt(a); } | ||||||
|  | 
 | ||||||
| /** \internal \returns the rounded value of \a a (coeff-wise) */ | /** \internal \returns the rounded value of \a a (coeff-wise) */ | ||||||
| template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS | template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS | ||||||
| Packet pround(const Packet& a) { using numext::round; return round(a); } | Packet pround(const Packet& a) { using numext::round; return round(a); } | ||||||
|  | |||||||
| @ -89,6 +89,7 @@ namespace Eigen | |||||||
|   EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(arg,scalar_arg_op,complex argument,\sa ArrayBase::arg DOXCOMMA MatrixBase::cwiseArg) |   EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(arg,scalar_arg_op,complex argument,\sa ArrayBase::arg DOXCOMMA MatrixBase::cwiseArg) | ||||||
|   EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(carg, scalar_carg_op, complex argument, \sa ArrayBase::carg DOXCOMMA MatrixBase::cwiseCArg) |   EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(carg, scalar_carg_op, complex argument, \sa ArrayBase::carg DOXCOMMA MatrixBase::cwiseCArg) | ||||||
|   EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(sqrt,scalar_sqrt_op,square root,\sa ArrayBase::sqrt DOXCOMMA MatrixBase::cwiseSqrt) |   EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(sqrt,scalar_sqrt_op,square root,\sa ArrayBase::sqrt DOXCOMMA MatrixBase::cwiseSqrt) | ||||||
|  |   EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(cbrt,scalar_cbrt_op,cube root,\sa ArrayBase::cbrt DOXCOMMA MatrixBase::cwiseCbrt) | ||||||
|   EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(rsqrt,scalar_rsqrt_op,reciprocal square root,\sa ArrayBase::rsqrt) |   EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(rsqrt,scalar_rsqrt_op,reciprocal square root,\sa ArrayBase::rsqrt) | ||||||
|   EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(square,scalar_square_op,square (power 2),\sa Eigen::abs2 DOXCOMMA Eigen::pow DOXCOMMA ArrayBase::square) |   EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(square,scalar_square_op,square (power 2),\sa Eigen::abs2 DOXCOMMA Eigen::pow DOXCOMMA ArrayBase::square) | ||||||
|   EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(cube,scalar_cube_op,cube (power 3),\sa Eigen::pow DOXCOMMA ArrayBase::cube) |   EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(cube,scalar_cube_op,cube (power 3),\sa Eigen::pow DOXCOMMA ArrayBase::cube) | ||||||
|  | |||||||
| @ -1394,6 +1394,14 @@ bool sqrt<bool>(const bool &x) { return x; } | |||||||
| SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(sqrt, sqrt) | SYCL_SPECIALIZE_FLOATING_TYPES_UNARY(sqrt, sqrt) | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | /** \returns the cube root of \a x. **/ | ||||||
|  | template<typename T> | ||||||
|  | EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE | ||||||
|  | T cbrt(const T &x) { | ||||||
|  |   EIGEN_USING_STD(cbrt); | ||||||
|  |   return static_cast<T>(cbrt(x)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /** \returns the reciprocal square root of \a x. **/ | /** \returns the reciprocal square root of \a x. **/ | ||||||
| template<typename T> | template<typename T> | ||||||
| EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE | EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE | ||||||
|  | |||||||
| @ -471,6 +471,20 @@ struct functor_traits<scalar_sqrt_op<bool> > { | |||||||
|   enum { Cost = 1, PacketAccess = packet_traits<bool>::Vectorizable }; |   enum { Cost = 1, PacketAccess = packet_traits<bool>::Vectorizable }; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | /** \internal
 | ||||||
|  |   * \brief Template functor to compute the cube root of a scalar | ||||||
|  |   * \sa class CwiseUnaryOp, Cwise::sqrt() | ||||||
|  |   */ | ||||||
|  | template <typename Scalar> | ||||||
|  | struct scalar_cbrt_op { | ||||||
|  |   EIGEN_DEVICE_FUNC inline const Scalar operator()(const Scalar& a) const { return numext::cbrt(a); } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | template <typename Scalar> | ||||||
|  | struct functor_traits<scalar_cbrt_op<Scalar> > { | ||||||
|  |   enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = false }; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| /** \internal
 | /** \internal
 | ||||||
|   * \brief Template functor to compute the reciprocal square root of a scalar |   * \brief Template functor to compute the reciprocal square root of a scalar | ||||||
|   * \sa class CwiseUnaryOp, Cwise::rsqrt() |   * \sa class CwiseUnaryOp, Cwise::rsqrt() | ||||||
|  | |||||||
| @ -185,6 +185,7 @@ template<typename Scalar> struct scalar_abs_op; | |||||||
| template<typename Scalar> struct scalar_abs2_op; | template<typename Scalar> struct scalar_abs2_op; | ||||||
| template<typename LhsScalar,typename RhsScalar=LhsScalar> struct scalar_absolute_difference_op; | template<typename LhsScalar,typename RhsScalar=LhsScalar> struct scalar_absolute_difference_op; | ||||||
| template<typename Scalar> struct scalar_sqrt_op; | template<typename Scalar> struct scalar_sqrt_op; | ||||||
|  | template<typename Scalar> struct scalar_cbrt_op; | ||||||
| template<typename Scalar> struct scalar_rsqrt_op; | template<typename Scalar> struct scalar_rsqrt_op; | ||||||
| template<typename Scalar> struct scalar_exp_op; | template<typename Scalar> struct scalar_exp_op; | ||||||
| template<typename Scalar> struct scalar_log_op; | template<typename Scalar> struct scalar_log_op; | ||||||
|  | |||||||
| @ -5,6 +5,7 @@ typedef CwiseUnaryOp<internal::scalar_arg_op<Scalar>, const Derived> ArgReturnTy | |||||||
| typedef CwiseUnaryOp<internal::scalar_carg_op<Scalar>, const Derived> CArgReturnType; | typedef CwiseUnaryOp<internal::scalar_carg_op<Scalar>, const Derived> CArgReturnType; | ||||||
| typedef CwiseUnaryOp<internal::scalar_abs2_op<Scalar>, const Derived> Abs2ReturnType; | typedef CwiseUnaryOp<internal::scalar_abs2_op<Scalar>, const Derived> Abs2ReturnType; | ||||||
| typedef CwiseUnaryOp<internal::scalar_sqrt_op<Scalar>, const Derived> SqrtReturnType; | typedef CwiseUnaryOp<internal::scalar_sqrt_op<Scalar>, const Derived> SqrtReturnType; | ||||||
|  | typedef CwiseUnaryOp<internal::scalar_cbrt_op<Scalar>, const Derived> CbrtReturnType; | ||||||
| typedef CwiseUnaryOp<internal::scalar_rsqrt_op<Scalar>, const Derived> RsqrtReturnType; | typedef CwiseUnaryOp<internal::scalar_rsqrt_op<Scalar>, const Derived> RsqrtReturnType; | ||||||
| typedef CwiseUnaryOp<internal::scalar_sign_op<Scalar>, const Derived> SignReturnType; | typedef CwiseUnaryOp<internal::scalar_sign_op<Scalar>, const Derived> SignReturnType; | ||||||
| typedef CwiseUnaryOp<internal::scalar_inverse_op<Scalar>, const Derived> InverseReturnType; | typedef CwiseUnaryOp<internal::scalar_inverse_op<Scalar>, const Derived> InverseReturnType; | ||||||
| @ -184,7 +185,7 @@ log2() const | |||||||
|   * Example: \include Cwise_sqrt.cpp |   * Example: \include Cwise_sqrt.cpp | ||||||
|   * Output: \verbinclude Cwise_sqrt.out |   * Output: \verbinclude Cwise_sqrt.out | ||||||
|   * |   * | ||||||
|   * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_sqrt">Math functions</a>, pow(), square() |   * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_sqrt">Math functions</a>, pow(), square(), cbrt() | ||||||
|   */ |   */ | ||||||
| EIGEN_DEVICE_FUNC | EIGEN_DEVICE_FUNC | ||||||
| inline const SqrtReturnType | inline const SqrtReturnType | ||||||
| @ -193,6 +194,22 @@ sqrt() const | |||||||
|   return SqrtReturnType(derived()); |   return SqrtReturnType(derived()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /** \returns an expression of the coefficient-wise cube root of *this. | ||||||
|  |   * | ||||||
|  |   * This function computes the coefficient-wise cube root.  | ||||||
|  |   * | ||||||
|  |   * Example: \include Cwise_cbrt.cpp | ||||||
|  |   * Output: \verbinclude Cwise_cbrt.out | ||||||
|  |   * | ||||||
|  |   * \sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_cbrt">Math functions</a>, sqrt(), pow(), square() | ||||||
|  |   */ | ||||||
|  | EIGEN_DEVICE_FUNC | ||||||
|  | inline const CbrtReturnType | ||||||
|  | cbrt() const | ||||||
|  | { | ||||||
|  |   return CbrtReturnType(derived()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /** \returns an expression of the coefficient-wise inverse square root of *this. | /** \returns an expression of the coefficient-wise inverse square root of *this. | ||||||
|   * |   * | ||||||
|   * This function computes the coefficient-wise inverse square root. |   * This function computes the coefficient-wise inverse square root. | ||||||
|  | |||||||
| @ -17,6 +17,7 @@ typedef CwiseUnaryOp<internal::scalar_abs2_op<Scalar>, const Derived> CwiseAbs2R | |||||||
| typedef CwiseUnaryOp<internal::scalar_arg_op<Scalar>, const Derived> CwiseArgReturnType; | typedef CwiseUnaryOp<internal::scalar_arg_op<Scalar>, const Derived> CwiseArgReturnType; | ||||||
| typedef CwiseUnaryOp<internal::scalar_carg_op<Scalar>, const Derived> CwiseCArgReturnType; | typedef CwiseUnaryOp<internal::scalar_carg_op<Scalar>, const Derived> CwiseCArgReturnType; | ||||||
| typedef CwiseUnaryOp<internal::scalar_sqrt_op<Scalar>, const Derived> CwiseSqrtReturnType; | typedef CwiseUnaryOp<internal::scalar_sqrt_op<Scalar>, const Derived> CwiseSqrtReturnType; | ||||||
|  | typedef CwiseUnaryOp<internal::scalar_cbrt_op<Scalar>, const Derived> CwiseCbrtReturnType; | ||||||
| typedef CwiseUnaryOp<internal::scalar_sign_op<Scalar>, const Derived> CwiseSignReturnType; | typedef CwiseUnaryOp<internal::scalar_sign_op<Scalar>, const Derived> CwiseSignReturnType; | ||||||
| typedef CwiseUnaryOp<internal::scalar_inverse_op<Scalar>, const Derived> CwiseInverseReturnType; | typedef CwiseUnaryOp<internal::scalar_inverse_op<Scalar>, const Derived> CwiseInverseReturnType; | ||||||
| 
 | 
 | ||||||
| @ -53,12 +54,25 @@ cwiseAbs2() const { return CwiseAbs2ReturnType(derived()); } | |||||||
| ///
 | ///
 | ||||||
| EIGEN_DOC_UNARY_ADDONS(cwiseSqrt,square-root) | EIGEN_DOC_UNARY_ADDONS(cwiseSqrt,square-root) | ||||||
| ///
 | ///
 | ||||||
| /// \sa cwisePow(), cwiseSquare()
 | /// \sa cwisePow(), cwiseSquare(), cwiseCbrt()
 | ||||||
| ///
 | ///
 | ||||||
| EIGEN_DEVICE_FUNC | EIGEN_DEVICE_FUNC | ||||||
| inline const CwiseSqrtReturnType | inline const CwiseSqrtReturnType | ||||||
| cwiseSqrt() const { return CwiseSqrtReturnType(derived()); } | cwiseSqrt() const { return CwiseSqrtReturnType(derived()); } | ||||||
| 
 | 
 | ||||||
|  | /// \returns an expression of the coefficient-wise cube root of *this.
 | ||||||
|  | ///
 | ||||||
|  | /// Example: \include MatrixBase_cwiseCbrt.cpp
 | ||||||
|  | /// Output: \verbinclude MatrixBase_cwiseCbrt.out
 | ||||||
|  | ///
 | ||||||
|  | EIGEN_DOC_UNARY_ADDONS(cwiseCbrt,cube-root) | ||||||
|  | ///
 | ||||||
|  | /// \sa cwiseSqrt(), cwiseSquare(), cwisePow()
 | ||||||
|  | ///
 | ||||||
|  | EIGEN_DEVICE_FUNC | ||||||
|  | inline const CwiseCbrtReturnType | ||||||
|  | cwiseCbrt() const { return CwiseSCbrtReturnType(derived()); } | ||||||
|  | 
 | ||||||
| /// \returns an expression of the coefficient-wise signum of *this.
 | /// \returns an expression of the coefficient-wise signum of *this.
 | ||||||
| ///
 | ///
 | ||||||
| /// Example: \include MatrixBase_cwiseSign.cpp
 | /// Example: \include MatrixBase_cwiseSign.cpp
 | ||||||
|  | |||||||
| @ -140,6 +140,8 @@ R.array().square()             // P .^ 2 | |||||||
| R.array().cube()               // P .^ 3 | R.array().cube()               // P .^ 3 | ||||||
| R.cwiseSqrt()                  // sqrt(P) | R.cwiseSqrt()                  // sqrt(P) | ||||||
| R.array().sqrt()               // sqrt(P) | R.array().sqrt()               // sqrt(P) | ||||||
|  | R.cwiseCbrt()                  // cbrt(P) | ||||||
|  | R.array().cbrt()               // cbrt(P) | ||||||
| R.array().exp()                // exp(P) | R.array().exp()                // exp(P) | ||||||
| R.array().log()                // log(P) | R.array().log()                // log(P) | ||||||
| R.cwiseMax(P)                  // max(R, P) | R.cwiseMax(P)                  // max(R, P) | ||||||
|  | |||||||
| @ -170,6 +170,19 @@ This also means that, unless specified, if the function \c std::foo is available | |||||||
|   sqrt(a[i]);</td> |   sqrt(a[i]);</td> | ||||||
|   <td>SSE2, AVX (f,d)</td> |   <td>SSE2, AVX (f,d)</td> | ||||||
| </tr> | </tr> | ||||||
|  | <tr> | ||||||
|  |   <td class="code"> | ||||||
|  |   \anchor cwisetable_cbrt | ||||||
|  |   a.\link ArrayBase::cbrt cbrt\endlink(); \n | ||||||
|  |   \link Eigen::cbrt cbrt\endlink(a);\n | ||||||
|  |   m.\link MatrixBase::cwiseCbrt cwiseCbrt\endlink(); | ||||||
|  |   </td> | ||||||
|  |   <td>computes cube root (\f$ \cbrt a_i \f$)</td> | ||||||
|  |   <td class="code"> | ||||||
|  |   using <a href="http://en.cppreference.com/w/cpp/numeric/math/cbrt">std::cbrt</a>; \n | ||||||
|  |   cbrt(a[i]);</td> | ||||||
|  |   <td></td> | ||||||
|  | </tr> | ||||||
| <tr> | <tr> | ||||||
|   <td class="code"> |   <td class="code"> | ||||||
|   \anchor cwisetable_rsqrt |   \anchor cwisetable_rsqrt | ||||||
|  | |||||||
| @ -458,6 +458,7 @@ mat1.cwiseMax(mat2)         mat1.cwiseMax(scalar) | |||||||
| mat1.cwiseAbs2() | mat1.cwiseAbs2() | ||||||
| mat1.cwiseAbs() | mat1.cwiseAbs() | ||||||
| mat1.cwiseSqrt() | mat1.cwiseSqrt() | ||||||
|  | mat1.cwiseCbrt() | ||||||
| mat1.cwiseInverse() | mat1.cwiseInverse() | ||||||
| mat1.cwiseProduct(mat2) | mat1.cwiseProduct(mat2) | ||||||
| mat1.cwiseQuotient(mat2) | mat1.cwiseQuotient(mat2) | ||||||
| @ -470,6 +471,7 @@ mat1.array().max(mat2.array())    mat1.array().max(scalar) | |||||||
| mat1.array().abs2() | mat1.array().abs2() | ||||||
| mat1.array().abs() | mat1.array().abs() | ||||||
| mat1.array().sqrt() | mat1.array().sqrt() | ||||||
|  | mat1.array().cbrt() | ||||||
| mat1.array().inverse() | mat1.array().inverse() | ||||||
| mat1.array() * mat2.array() | mat1.array() * mat2.array() | ||||||
| mat1.array() / mat2.array() | mat1.array() / mat2.array() | ||||||
|  | |||||||
| @ -172,6 +172,7 @@ sm2 = perm * sm1;    // Permute the columns | |||||||
|   sm1.cwiseMax(sm2); |   sm1.cwiseMax(sm2); | ||||||
|   sm1.cwiseAbs(); |   sm1.cwiseAbs(); | ||||||
|   sm1.cwiseSqrt(); |   sm1.cwiseSqrt(); | ||||||
|  |   sm1.cwiseCbrt(); | ||||||
|   \endcode</td> |   \endcode</td> | ||||||
|   <td> |   <td> | ||||||
|   sm1 and sm2 should have the same storage order |   sm1 and sm2 should have the same storage order | ||||||
|  | |||||||
							
								
								
									
										2
									
								
								doc/snippets/Cwise_cbrt.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								doc/snippets/Cwise_cbrt.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,2 @@ | |||||||
|  | Array3d v(1,2,4); | ||||||
|  | cout << v.cbrt() << endl; | ||||||
| @ -169,7 +169,9 @@ void unary_op_test(std::string name, Fn fun, RefFn ref) { | |||||||
| 
 | 
 | ||||||
| template <typename Scalar> | template <typename Scalar> | ||||||
| void unary_ops_test() { | void unary_ops_test() { | ||||||
|  |    | ||||||
|   unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(sqrt)); |   unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(sqrt)); | ||||||
|  |   unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(cbrt)); | ||||||
|   unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(exp)); |   unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(exp)); | ||||||
|   unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(log)); |   unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(log)); | ||||||
|   unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(sin)); |   unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(sin)); | ||||||
| @ -821,6 +823,7 @@ template<typename ArrayType> void array_real(const ArrayType& m) | |||||||
|   m3 = m4.abs(); |   m3 = m4.abs(); | ||||||
| 
 | 
 | ||||||
|   VERIFY_IS_APPROX(m3.sqrt(), sqrt(abs(m3))); |   VERIFY_IS_APPROX(m3.sqrt(), sqrt(abs(m3))); | ||||||
|  |   VERIFY_IS_APPROX(m3.cbrt(), cbrt(m3)); | ||||||
|   VERIFY_IS_APPROX(m3.rsqrt(), Scalar(1)/sqrt(abs(m3))); |   VERIFY_IS_APPROX(m3.rsqrt(), Scalar(1)/sqrt(abs(m3))); | ||||||
|   VERIFY_IS_APPROX(rsqrt(m3), Scalar(1)/sqrt(abs(m3))); |   VERIFY_IS_APPROX(rsqrt(m3), Scalar(1)/sqrt(abs(m3))); | ||||||
|   VERIFY_IS_APPROX(m3.log(), log(m3)); |   VERIFY_IS_APPROX(m3.log(), log(m3)); | ||||||
| @ -882,6 +885,8 @@ template<typename ArrayType> void array_real(const ArrayType& m) | |||||||
| 
 | 
 | ||||||
|   VERIFY_IS_APPROX(m3.pow(RealScalar(0.5)), m3.sqrt()); |   VERIFY_IS_APPROX(m3.pow(RealScalar(0.5)), m3.sqrt()); | ||||||
|   VERIFY_IS_APPROX(pow(m3,RealScalar(0.5)), m3.sqrt()); |   VERIFY_IS_APPROX(pow(m3,RealScalar(0.5)), m3.sqrt()); | ||||||
|  |   VERIFY_IS_APPROX(m3.pow(RealScalar(1.0/3.0)), m3.cbrt()); | ||||||
|  |   VERIFY_IS_APPROX(pow(m3,RealScalar(1.0/3.0)), m3.cbrt()); | ||||||
| 
 | 
 | ||||||
|   VERIFY_IS_APPROX(m3.pow(RealScalar(-0.5)), m3.rsqrt()); |   VERIFY_IS_APPROX(m3.pow(RealScalar(-0.5)), m3.rsqrt()); | ||||||
|   VERIFY_IS_APPROX(pow(m3,RealScalar(-0.5)), m3.rsqrt()); |   VERIFY_IS_APPROX(pow(m3,RealScalar(-0.5)), m3.rsqrt()); | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Kyle Macfarlan
						Kyle Macfarlan