Windows下boost::polygon的32位整数高精度默认类型是否已过时?
关于boost::polygon在MSVC下的精度问题及解决方法
不少开发者在使用boost::polygon处理带重叠线段、多交点重合的复杂多边形布尔并运算时,都碰到过你提到的问题:
boost::polygon默认给int类型指定的high_precision_type<int>::type是long double,但在Visual Studio的MSVC编译器里,long double其实是double的别名,精度只有约15-17位有效数字,完全满足不了保留int类型30位精度的需求,这会导致计算过程中出现精度丢失,进而引发布尔运算结果错误。
你采用的模板特化方式是解决这个问题的标准方案:通过在boost::polygon命名空间下特化high_precision_type模板,将int和int64_t对应的高精度类型替换为multiprecision::int128_t——这种整数类型能精准保留30位以上的整数精度,彻底避免浮点运算带来的精度误差。
你的实现代码如下:
namespace boost::polygon { template<> struct high_precision_type<int64_t> { using type = multiprecision::int128_t; }; template<> struct high_precision_type<int> { using type = multiprecision::int128_t; }; }
很多遇到相同问题的开发者都用类似的方法解决了精度不足的问题,你的写法是完全正确的。
内容的提问来源于stack exchange,提问作者Catriel
相关产品推荐
相关产品推荐

