Boost logo

Ublas :

Subject: Re: [ublas] Return type of 'mean_square'
From: Nasos Iliopoulos (nasos_i_at_[hidden])
Date: 2015-09-16 20:53:12


I am not sure which part you are referring to but I believe it should
should be something along those lines:

typedef ublas::promote_traits<typename M1::value_type, typename
M1::value_type>::promote_type intermediate_t;

typedef boost::mpl::if_c<boost::mpl::is_integral<intermediate_t>::value,
                              long double,
                              intermediate_t>::type type;

-Nasos

On 09/16/2015 08:08 AM, Joaquim Duran Comas wrote:
> Currently, I've implemented:
>
> template <class AE>
> struct distance {
> typedef boost::mpl::if_c<boost::mpl::is_integral<typename
> AE::value_type>::value,
> long double,
> typename AE::value_type>::type type;
> };
>
> template <class AE>
> typename distance<AE>::type mean_square(const
> boost::numeric::ublas::matrix_expression<AE> &me) {
> typename distance<AE>::type s(0);
>
> [...]
>
> return s / (me().size1() * me().size2());
> }
>
> However, to use 'distance' struct in compare_distance functions, I
> need the AE type, however in compare_distance function there are M1
> and M2 matrices but not AE. Which expression I could use to get AE?
>
> Joaquim Duran
>
>
> 2015-08-18 18:02 GMT+02:00 Nasos Iliopoulos <nasos_i_at_[hidden]
> <mailto:nasos_i_at_[hidden]>>:
>
> Rethinking it it seems that if it is an integral type we should be
> using floating type (like long double) and if not we should be
> using the type itself. This would cover cases of using higher
> precision arithmetic (like using boost::multi-precision)
>
> Something like:
>
> #include <boost/mpl/if.hpp>
> #include <boost/type_traits/is_integral.hpp>
> ...
> typedef boost::mpl::if_c<boost::mpl::is_integral<typename
> AE::value_type>::value, long double, typename
> AE::value_type>::type return_type;
>
> -Nasos
>
>
> On 08/18/2015 11:14 AM, Marco Guazzone wrote:
>
> Don't know enough detail about the mean_square function, but
> what if
> AE::value_type is a long double?
>
> Maybe you could use type deduction like the following:
>
> typename ublas::promote_traits<typename
> AE::value_type,double>::promote_type
>
> I've written the following example:
>
> --- [snip] ---
> #include <boost/numeric/ublas/traits.hpp>
> #include <iostream>
>
> void foo(long double x)
> {
> (void)x;
> std::cout << "LONG DOUBLE" << std::endl;
> }
> void foo(double x)
> {
> (void)x;
> std::cout << "DOUBLE" << std::endl;
> }
>
> int main()
> {
> namespace ublas = boost::numeric::ublas;
>
> std::cout << "long double vs. double -> ";
> ublas::promote_traits<long double,double>::promote_type
> ld_d = 0;
> foo(ld_d);
> std::cout << std::endl;
>
> std::cout << "int vs. double -> ";
> ublas::promote_traits<int,double>::promote_type i_d = 0;
> foo(i_d);
> std::cout << std::endl;
>
> std::cout << "long vs. double -> ";
> ublas::promote_traits<long,double>::promote_type l_d = 0;
> foo(l_d);
> std::cout << std::endl;
> }
> --- [/snip] ---
>
> I've compiled on my machine (Linux 64bit with GCC 5.1.1
> 20150618 (Red
> Hat 5.1.1-4)) with flags "-Wall -Wextra -ansi -pedantic", and the
> result is:
>
> long double vs. double -> LONG DOUBLE
>
> int vs. double -> DOUBLE
>
> long vs. double -> DOUBLE
>
>
> Marco
>
> On Tue, Aug 18, 2015 at 4:35 PM, Nasos Iliopoulos
> <nasos_i_at_[hidden] <mailto:nasos_i_at_[hidden]>> wrote:
>
> I was debating this myself. I think converting to double
> is a good idea.
>
> -Nasos
>
> you cast the type do double before.
>
>
> On 08/10/2015 11:40 AM, Joaquim Duran Comas wrote:
>
> Hello,
>
> Few days ago, I patched the function 'mean_square' for
> vectors and matrices.
> Currently, the current return type of the function is
> AE::value_type. To get
> better accuracy, is it better return double type than
> AE::value_type
> (specially if it is an integuer)?
>
> Joaquim Duran
>
>
>
> _______________________________________________
> ublas mailing list
> ublas_at_[hidden] <mailto:ublas_at_[hidden]>
> http://lists.boost.org/mailman/listinfo.cgi/ublas
> Sent to: athanasios.iliopoulos.ctr.gr_at_[hidden]
> <mailto:athanasios.iliopoulos.ctr.gr_at_[hidden]>
>
>
>
> _______________________________________________
> ublas mailing list
> ublas_at_[hidden] <mailto:ublas_at_[hidden]>
> http://lists.boost.org/mailman/listinfo.cgi/ublas
> Sent to: marco.guazzone_at_[hidden]
> <mailto:marco.guazzone_at_[hidden]>
>
> _______________________________________________
> ublas mailing list
> ublas_at_[hidden] <mailto:ublas_at_[hidden]>
> http://lists.boost.org/mailman/listinfo.cgi/ublas
> Sent to: athanasios.iliopoulos.ctr.gr_at_[hidden]
> <mailto:athanasios.iliopoulos.ctr.gr_at_[hidden]>
>
>
> _______________________________________________
> ublas mailing list
> ublas_at_[hidden] <mailto:ublas_at_[hidden]>
> http://lists.boost.org/mailman/listinfo.cgi/ublas
> Sent to: jdurancomas_at_[hidden] <mailto:jdurancomas_at_[hidden]>
>
>
>
>
> _______________________________________________
> ublas mailing list
> ublas_at_[hidden]
> http://lists.boost.org/mailman/listinfo.cgi/ublas
> Sent to: nasos_i_at_[hidden]