Boost logo

Boost Users :

Subject: [Boost-users] [Boost.polygon.voronoi] [Boost.multiprecision] higher precision voronoi
From: Weatherby,Gerard (gweatherby_at_[hidden])
Date: 2014-03-16 16:57:42


I'm attempting to following the http://www.boost.org/doc/libs/1_53_0_beta1/libs/polygon/doc/voronoi_advanced_tutorial.htm
to compile boost::polygon::voronoi using 64 bit integer input. I'm using the boost::multiprecision library to do so.
Using boost version 1.53 and Microsoft Visual Studio 2012.

The error message is:
1>d:\workspace\movingboundary\boost_1_53_0\boost\polygon\detail\voronoi_robust_fpt.hpp(60): error C2665: 'sqrt' : none of the 3 overloads could convert all the argument types
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\math.h(588): could be 'long double sqrt(long double)'
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\math.h(540): or 'float sqrt(float)'
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\math.h(127): or 'double sqrt(double)'
1> while trying to match the argument list '(const boost::multiprecision::detail::expression<tag,Arg1,Arg2,Arg3,Arg4>)'
1> with
1> [
1> tag=boost::multiprecision::detail::multiplies,
1> Arg1=boost::multiprecision::detail::expression<boost::multiprecision::detail::multiplies,boost::multiprecision::detail::expression<boost::multiprecision::detail::plus,boost::multiprecision::detail::expression<boost::multiprecision::detail::multiply_immediates,boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<48>>,boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<48>>,void,void>,boost::multiprecision::detail::expression<boost::multiprecision::detail::multiply_immediates,boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<48>>,boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<48>>,void,void>,void,void>,boost::multiprecision::detail::expression<boost::multiprecision::detail::plus,boost::multiprecision::detail::expression<boost::multiprecision::detail::multiply_immediates,boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<48>>,boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<48>>,void,void>,boost::multiprecision::detail::expression<boost::multiprecision::detail::multiply_immediates,boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<48>>,boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<48>>,void,void>,void,void>,void,void>,
1> Arg2=boost::multiprecision::detail::expression<boost::multiprecision::detail::plus,boost::multiprecision::detail::expression<boost::multiprecision::detail::multiply_immediates,boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<48>>,boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<48>>,void,void>,boost::multiprecision::detail::expression<boost::multiprecision::detail::multiply_immediates,boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<48>>,boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<48>>,void,void>,void,void>,
1> Arg3=void,
1> Arg4=void

== reference line is
template <typename T>
T get_sqrt(const T& that) {
  return (std::sqrt)(that); //<-- line 60
}

== code ==

#pragma warning (disable: 4996 4267)
#include <cmath>
#include <boost/multiprecision/cpp_int.hpp>
#include <boost/multiprecision/cpp_dec_float.hpp>
#include <boost/polygon/voronoi.hpp>

#include <limits>
#include <gtest/gtest.h>

#include <iostream>
using namespace boost::polygon;

namespace vcellVoronoiImpl {
    typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<48>> floatingType;

    struct FloatingConverter {
        template <typename T>
        floatingType operator( )(T x) const {
            return static_cast<floatingType>(x);
        }
    };

    struct compareFloatingType {
        enum Result {
            LESS = -1,
            EQUAL = 0,
            MORE = 1
        };

        Result operator()(floatingType a, floatingType b, unsigned int maxUlps) const {
            if (a > b) {
                return a - b <= maxUlps ? EQUAL : LESS;
            }
            return b - a <= maxUlps ? EQUAL : MORE;
        }
    };

    struct voronoi_ctype_traits {
        typedef boost::int64_t int_type;
        typedef boost::multiprecision::int128_t int_x2_type;
        typedef boost::multiprecision::uint128_t uint_x2_type;
        typedef boost::multiprecision::int512_t big_int_type;
        typedef floatingType fpt_type;
        typedef floatingType efpt_type;
        typedef compareFloatingType ulp_cmp_type;
        typedef FloatingConverter to_fpt_converter_type;
        typedef FloatingConverter to_efpt_converter_type;
    };

    struct vcell_vd_traits{
        typedef voronoi_ctype_traits::fpt_type coordinate_type;
        typedef voronoi_cell<coordinate_type> cell_type;
        typedef voronoi_vertex<coordinate_type> vertex_type;
        typedef voronoi_edge<coordinate_type> edge_type;
        typedef struct {
        public:
            enum { ULPS = 128 };
            bool operator()(const vertex_type &v1, const vertex_type &v2) const {
                return (ulp_cmp(v1.x(), v2.x(), ULPS) == compareFloatingType::EQUAL &&
                    ulp_cmp(v1.y(), v2.y(), ULPS) == compareFloatingType::EQUAL);
            }
        private:
            compareFloatingType ulp_cmp;
        } vertex_equality_predicate_type;

    };
}

using namespace vcellVoronoiImpl;

TEST(highv,build) {
    voronoi_builder<boost::int64_t, vcellVoronoiImpl::voronoi_ctype_traits> vb;
    voronoi_diagram<boost::int64_t,vcell_vd_traits> vd;
    vb.construct(&vd);
}

Gerard Weatherby
Appllication Architect
Virtual Cell, Center for Cell Analysis and Modeling (CCAM)
University of Connecticut Health Center
860-679-2065



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net