c++ - 为什么 boost::geometry::distance 与 model::d2::point_xy<float> 返回 double 而不是 float ?

标签 c++ performance boost boost-geometry

我比较了 boost::geometry::distance 的性能上model::d2::point_xy<float>具有等效简单 2D 实现的参数:

struct Point {
  float x, y;
  float distance(const Point& p) const {return sqrt((x-p.x)*(x-p.x)+(y-p.y)*(y-p.y));}
};

(请参阅 http://rextester.com/NTOVR83857 处的整个基准)。我发现 boost 版本在所有主要 C++ 编译器中始终较慢:

  • gcc 为 1.77 倍
  • clang 为 1.47 倍
  • 对于 vc++ 为 1.51 倍

我尝试了与 double 相同的基准测试点坐标,boost 在其中执行而无需开销。我注意到boost::geometry::distancemodel::d2::point_xy<float>参数返回 double ,这似乎是减速的原因。为什么它不返回 float

最佳答案

由于boost使用模板,因此需要确保返回类型具有足够的精度。想象一下,如果输入点的 X 和 Y 具有整数值 - 结果需要的不仅仅是整数精度。此外,如果输入 Point 对 X 和 Y 使用 double 值,则 float 的结果将不够精确。因此,看来选择 double 作为足够的精度。

此处给出距离模板设计的基本原理:

http://www.boost.org/doc/libs/1_58_0/libs/geometry/doc/html/geometry/design.html

关于c++ - 为什么 boost::geometry::distance 与 model::d2::point_xy<float> 返回 double 而不是 float ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29983385/

相关文章:

c++ - boost::variant for boost::arrays of arbitrary size

c++ - 无法从 Windows xp x64 prof 中的用户帐户访问已安装过滤器驱动程序的重分析点目录

c++ - 如何将 std::queue 转换为 std::vector

java - Java 中的 Integer 缓存如何/为什么更快?

Javascript一次请求多个JS文件

c++ - 如何获取 WinRT 上的逻辑 CPU 数量?

c# - 我什么时候需要 Windows SDK 以及 .NET 的用途是什么?

c++ - VS C++ 2008 : Modifying Output text?

javascript - JQuery:Ajax 缓存 - 性能?

c++ - boost::program_options::notify() 有什么用?