From c8624ee0b3a1e63e21f172a3a4ebc33dc408539e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Thu, 9 Sep 2021 11:01:03 +0200 Subject: [PATCH] check that the rounding mode when doing exact computation is to-nearest --- Convex_hull_3/include/CGAL/convex_hull_3.h | 2 ++ .../include/CGAL/Filtered_construction.h | 3 +++ Filtered_kernel/include/CGAL/Filtered_predicate.h | 1 + .../include/CGAL/Filtered_predicate_with_state.h | 1 + Filtered_kernel/include/CGAL/Lazy.h | 14 ++++++++++++-- Nef_2/include/CGAL/Filtered_extended_homogeneous.h | 13 +++++++++++++ .../include/CGAL/NewKernel_d/Cartesian_filter_NT.h | 1 + .../include/CGAL/NewKernel_d/Filtered_predicate2.h | 1 + .../include/CGAL/NewKernel_d/Lazy_cartesian.h | 1 + Skin_surface_3/include/CGAL/Skin_surface_base_3.h | 6 ++++-- .../include/CGAL/triangulate_mixed_complex_3.h | 1 + .../Straight_skeleton_builder_traits_2_aux.h | 1 + 12 files changed, 41 insertions(+), 4 deletions(-) diff --git a/Convex_hull_3/include/CGAL/convex_hull_3.h b/Convex_hull_3/include/CGAL/convex_hull_3.h index cf35a6d78af..ad1ac57945f 100644 --- a/Convex_hull_3/include/CGAL/convex_hull_3.h +++ b/Convex_hull_3/include/CGAL/convex_hull_3.h @@ -359,6 +359,8 @@ public: } } catch (Uncertain_conversion_exception&){} + Protector protector(CGAL_FE_TONEAREST); + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); if (ek_plane_ptr==nullptr) { const typename Exact_K::Point_3 ep = to_EK(p); ek_plane_ptr = new Vector_plus_point; diff --git a/Filtered_kernel/include/CGAL/Filtered_construction.h b/Filtered_kernel/include/CGAL/Filtered_construction.h index 22b509bcabd..51910605980 100644 --- a/Filtered_kernel/include/CGAL/Filtered_construction.h +++ b/Filtered_kernel/include/CGAL/Filtered_construction.h @@ -55,6 +55,7 @@ public: {} } Protect_FPU_rounding P(CGAL_FE_TONEAREST); + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); return From_Exact( Exact_construction(To_Exact(a1)) ); } template @@ -72,6 +73,7 @@ public: {} } Protect_FPU_rounding P(CGAL_FE_TONEAREST); + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); return From_Exact( Exact_construction(To_Exact(a1), To_Exact(a2)) ); } @@ -92,6 +94,7 @@ public: {} } Protect_FPU_rounding P(CGAL_FE_TONEAREST); + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); return From_Exact( Exact_construction(To_Exact(a1), To_Exact(a2), To_Exact(a3)) ); diff --git a/Filtered_kernel/include/CGAL/Filtered_predicate.h b/Filtered_kernel/include/CGAL/Filtered_predicate.h index 63199a63a32..8fe25f2b5b6 100644 --- a/Filtered_kernel/include/CGAL/Filtered_predicate.h +++ b/Filtered_kernel/include/CGAL/Filtered_predicate.h @@ -103,6 +103,7 @@ Filtered_predicate:: } CGAL_BRANCH_PROFILER_BRANCH(tmp); Protect_FPU_rounding p(CGAL_FE_TONEAREST); + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); return ep(c2e(args)...); } diff --git a/Filtered_kernel/include/CGAL/Filtered_predicate_with_state.h b/Filtered_kernel/include/CGAL/Filtered_predicate_with_state.h index 56ef70f0ef9..efcbd15f74b 100644 --- a/Filtered_kernel/include/CGAL/Filtered_predicate_with_state.h +++ b/Filtered_kernel/include/CGAL/Filtered_predicate_with_state.h @@ -74,6 +74,7 @@ Filtered_predicate_with_state:: } CGAL_BRANCH_PROFILER_BRANCH(tmp); Protect_FPU_rounding p(CGAL_FE_TONEAREST); + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); if(! oep){ #if BOOST_VERSION < 105600 oep = EP(c2e(o1)); diff --git a/Filtered_kernel/include/CGAL/Lazy.h b/Filtered_kernel/include/CGAL/Lazy.h index 4a85eafc269..04bcfc034b6 100644 --- a/Filtered_kernel/include/CGAL/Lazy.h +++ b/Filtered_kernel/include/CGAL/Lazy.h @@ -803,6 +803,7 @@ struct Lazy_construction_bbox } CGAL_BRANCH_PROFILER_BRANCH(tmp); Protect_FPU_rounding P2(CGAL_FE_TONEAREST); + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); return ec(CGAL::exact(l1)); } }; @@ -851,6 +852,7 @@ struct Lazy_construction_nt { } CGAL_BRANCH_PROFILER_BRANCH(tmp); Protect_FPU_rounding P2(CGAL_FE_TONEAREST); + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); return new Lazy_rep_0 >(ec( CGAL::exact(l)... )); } @@ -1076,6 +1078,7 @@ public: } CGAL_BRANCH_PROFILER_BRANCH(tmp); Protect_FPU_rounding P2(CGAL_FE_TONEAREST); + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); typename R1::ET et; ec(CGAL::exact(l1), CGAL::exact(l2), et); r1 = R1(new Lazy_rep_0(et)); @@ -1147,6 +1150,7 @@ public: } CGAL_BRANCH_PROFILER_BRANCH(tmp); Protect_FPU_rounding P2(CGAL_FE_TONEAREST); + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); typename R1::ET et1, et2; ec(CGAL::exact(l1), CGAL::exact(l2), et1, et2); r1 = R1(Handle_1(new Lazy_rep_0(et1))); @@ -1205,6 +1209,7 @@ public: CGAL_BRANCH_PROFILER_BRANCH(tmp); // TODO: Instead of using a vector, write an iterator adapter Protect_FPU_rounding P2(CGAL_FE_TONEAREST); + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); std::vector exact_objects; ec(CGAL::exact(l1), CGAL::exact(l2), std::back_inserter(exact_objects)); for (std::vector::const_iterator oit = exact_objects.begin(); @@ -1283,6 +1288,7 @@ public: } CGAL_BRANCH_PROFILER_BRANCH(tmp); Protect_FPU_rounding P2(CGAL_FE_TONEAREST); + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); ET eto = ec(CGAL::exact(l1)); return make_lazy(eto); } @@ -1338,6 +1344,7 @@ public: } CGAL_BRANCH_PROFILER_BRANCH(tmp); Protect_FPU_rounding P2(CGAL_FE_TONEAREST); + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); ET eto = ec(CGAL::exact(l1), CGAL::exact(l2)); return make_lazy(eto); } @@ -1371,6 +1378,7 @@ public: } CGAL_BRANCH_PROFILER_BRANCH(tmp); Protect_FPU_rounding P2(CGAL_FE_TONEAREST); + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); ET eto = ec(CGAL::exact(l1), CGAL::exact(l2), CGAL::exact(l3)); return make_lazy(eto); } @@ -1544,7 +1552,7 @@ struct Lazy_construction_variant { } CGAL_BRANCH_PROFILER_BRANCH(tmp); Protect_FPU_rounding P2(CGAL_FE_TONEAREST); - + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); ET exact_v = EC()(CGAL::exact(l1), CGAL::exact(l2)); result_type res; @@ -1594,7 +1602,7 @@ struct Lazy_construction_variant { } CGAL_BRANCH_PROFILER_BRANCH(tmp); Protect_FPU_rounding P2(CGAL_FE_TONEAREST); - + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); ET exact_v = EC()(CGAL::exact(l1), CGAL::exact(l2), CGAL::exact(l3)); result_type res; @@ -1646,6 +1654,7 @@ struct Lazy_construction { } \ CGAL_BRANCH_PROFILER_BRANCH(tmp); \ Protect_FPU_rounding P2(CGAL_FE_TONEAREST); \ + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); \ return result_type( Handle(new Lazy_rep_0(ec( BOOST_PP_ENUM(n, CGAL_LEXACT, _) ))) ); \ } @@ -1714,6 +1723,7 @@ struct result { \ } \ CGAL_BRANCH_PROFILER_BRANCH(tmp); \ Protect_FPU_rounding P2(CGAL_FE_TONEAREST); \ + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); \ return result_type( Handle(new Lazy_rep_0(ec( BOOST_PP_ENUM(n, CGAL_LEXACT, _) ))) ); \ } diff --git a/Nef_2/include/CGAL/Filtered_extended_homogeneous.h b/Nef_2/include/CGAL/Filtered_extended_homogeneous.h index 48c23338465..32055377064 100644 --- a/Nef_2/include/CGAL/Filtered_extended_homogeneous.h +++ b/Nef_2/include/CGAL/Filtered_extended_homogeneous.h @@ -403,6 +403,7 @@ int orientation(const Extended_point& p1, run_exact=true; } } + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); if (run_exact) res = orientation_coeff2(p1.mx(),p1.nx(),p1.my(),p1.ny(),p1.hw(), p2.mx(),p2.nx(),p2.my(),p2.ny(),p2.hw(), @@ -422,6 +423,7 @@ int orientation(const Extended_point& p1, run_exact = true; } } + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); if (run_exact) res = orientation_coeff1(p1.mx(),p1.nx(),p1.my(),p1.ny(),p1.hw(), p2.mx(),p2.nx(),p2.my(),p2.ny(),p2.hw(), @@ -441,6 +443,7 @@ int orientation(const Extended_point& p1, run_exact = true; } } + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); if (run_exact) res = orientation_coeff0(p1.mx(),p1.nx(),p1.my(),p1.ny(),p1.hw(), p2.mx(),p2.nx(),p2.my(),p2.ny(),p2.hw(), @@ -473,6 +476,7 @@ int compare_x(const Extended_point& p1, run_exact = true; } } + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); if (run_exact) res = compare_expr(p1.mx(),p1.hw(),p2.mx(),p2.hw()); @@ -490,6 +494,7 @@ int compare_x(const Extended_point& p1, run_exact = true; } } + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); if (run_exact) res = compare_expr(p1.nx(),p1.hw(),p2.nx(),p2.hw()); return res; @@ -514,6 +519,7 @@ int compare_y(const Extended_point& p1, run_exact = true; } } + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); if (run_exact) res = compare_expr(p1.my(),p1.hw(),p2.my(),p2.hw()); if ( res != 0 ) return res; @@ -529,6 +535,7 @@ int compare_y(const Extended_point& p1, run_exact = true; } } + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); if (run_exact) res = compare_expr(p1.ny(),p1.hw(),p2.ny(),p2.hw()); return res; @@ -673,6 +680,7 @@ int compare_pair_dist( run_exact = true; } } + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); if (run_exact) res = cmppd_coeff2(p1.mx(),p1.nx(),p1.my(),p1.ny(),p1.hw(), p2.mx(),p2.nx(),p2.my(),p2.ny(),p2.hw(), @@ -695,6 +703,7 @@ int compare_pair_dist( run_exact = true; } } + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); if (run_exact) res = cmppd_coeff1(p1.mx(),p1.nx(),p1.my(),p1.ny(),p1.hw(), p2.mx(),p2.nx(),p2.my(),p2.ny(),p2.hw(), @@ -716,6 +725,7 @@ int compare_pair_dist( run_exact = true; } } + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); if (run_exact) res = cmppd_coeff0(p1.mx(),p1.nx(),p1.my(),p1.ny(),p1.hw(), p2.mx(),p2.nx(),p2.my(),p2.ny(),p2.hw(), @@ -959,6 +969,7 @@ int orientation(const Extended_direction& d1, run_exact=true; } } + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); if (run_exact) res = coeff2_dor(p1.mx(),p1.nx(),p1.my(),p1.ny(),p1.hw(), p2.mx(),p2.nx(),p2.my(),p2.ny(),p2.hw(), @@ -979,6 +990,7 @@ int orientation(const Extended_direction& d1, run_exact=true; } } + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); if (run_exact) res = coeff1_dor(p1.mx(),p1.nx(),p1.my(),p1.ny(),p1.hw(), p2.mx(),p2.nx(),p2.my(),p2.ny(),p2.hw(), @@ -1000,6 +1012,7 @@ int orientation(const Extended_direction& d1, run_exact = true; } } + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); if(run_exact) res = coeff0_dor(p1.mx(),p1.nx(),p1.my(),p1.ny(),p1.hw(), p2.mx(),p2.nx(),p2.my(),p2.ny(),p2.hw(), diff --git a/NewKernel_d/include/CGAL/NewKernel_d/Cartesian_filter_NT.h b/NewKernel_d/include/CGAL/NewKernel_d/Cartesian_filter_NT.h index d2fad323fe4..02dab4dbbcc 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Cartesian_filter_NT.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Cartesian_filter_NT.h @@ -48,6 +48,7 @@ struct Cartesian_filter_NT : public Base_ if(is_certain(res)) return get_certain(res); } catch (Uncertain_conversion_exception&) {} } + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); return p2(std::forward(u)...); } }; diff --git a/NewKernel_d/include/CGAL/NewKernel_d/Filtered_predicate2.h b/NewKernel_d/include/CGAL/NewKernel_d/Filtered_predicate2.h index c3d2281ad96..b7fefa139b6 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Filtered_predicate2.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Filtered_predicate2.h @@ -88,6 +88,7 @@ public: } CGAL_BRANCH_PROFILER_BRANCH(tmp); Protect_FPU_rounding p(CGAL_FE_TONEAREST); + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); return ep(c2e(std::forward(args))...); } }; diff --git a/NewKernel_d/include/CGAL/NewKernel_d/Lazy_cartesian.h b/NewKernel_d/include/CGAL/NewKernel_d/Lazy_cartesian.h index 7e82e90a407..cc96d8e5f12 100644 --- a/NewKernel_d/include/CGAL/NewKernel_d/Lazy_cartesian.h +++ b/NewKernel_d/include/CGAL/NewKernel_d/Lazy_cartesian.h @@ -184,6 +184,7 @@ struct Lazy_construction2 { } CGAL_BRANCH_PROFILER_BRANCH(tmp); Protect_FPU_rounding P2(CGAL_FE_TONEAREST); + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); return new Lazy_rep_0(ec(CGAL::exact(l)...)); } // FIXME: this forces us to have default constructors for all types, try to make its instantiation lazier diff --git a/Skin_surface_3/include/CGAL/Skin_surface_base_3.h b/Skin_surface_3/include/CGAL/Skin_surface_base_3.h index 57f8d2306e1..3c6507ca49e 100644 --- a/Skin_surface_3/include/CGAL/Skin_surface_base_3.h +++ b/Skin_surface_3/include/CGAL/Skin_surface_base_3.h @@ -313,7 +313,7 @@ sign(TMC_Vertex_handle vit) const } CGAL_BRANCH_PROFILER_BRANCH(tmp); Protect_FPU_rounding P(CGAL_FE_TONEAREST); - + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); typedef Exact_predicates_exact_constructions_kernel EK; typedef Skin_surface_traits_3 Exact_skin_surface_traits; typedef Skin_surface_base_3 Exact_skin_surface_base; @@ -355,6 +355,7 @@ sign(const Bare_point &p, const Cell_info &info) const } CGAL_BRANCH_PROFILER_BRANCH(tmp); Protect_FPU_rounding P(CGAL_FE_TONEAREST); + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); return construct_surface(info.first, Exact_predicates_exact_constructions_kernel()).sign(p); } @@ -630,7 +631,7 @@ compare(Cell_info &info1, const Bare_point &p1, } CGAL_BRANCH_PROFILER_BRANCH(tmp); Protect_FPU_rounding P(CGAL_FE_TONEAREST); - + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); return CGAL_NTS sign( construct_surface(info1.first, Exact_predicates_exact_constructions_kernel()).value(p1) - @@ -697,6 +698,7 @@ locate_in_tmc(const Bare_point &p0, TMC_Cell_handle start) const *pts[2], *pts[3]); } catch (Uncertain_conversion_exception&) { run_exact=true; } } + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); if (run_exact) { Protect_FPU_rounding P(CGAL_FE_TONEAREST); diff --git a/Skin_surface_3/include/CGAL/triangulate_mixed_complex_3.h b/Skin_surface_3/include/CGAL/triangulate_mixed_complex_3.h index c643fe88ddd..92bfb84c326 100644 --- a/Skin_surface_3/include/CGAL/triangulate_mixed_complex_3.h +++ b/Skin_surface_3/include/CGAL/triangulate_mixed_complex_3.h @@ -1210,6 +1210,7 @@ orientation(Tmc_Cell_handle ch) } catch (Uncertain_conversion_exception&) {} } Protect_FPU_rounding P(CGAL_FE_TONEAREST); + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); typedef Exact_predicates_exact_constructions_kernel EK; typedef Cartesian_converter Exact_converter; typedef Skin_surface_traits_3 Exact_traits; diff --git a/Straight_skeleton_2/include/CGAL/Straight_skeleton_2/Straight_skeleton_builder_traits_2_aux.h b/Straight_skeleton_2/include/CGAL/Straight_skeleton_2/Straight_skeleton_builder_traits_2_aux.h index 973e7abeae8..6939ad21b72 100644 --- a/Straight_skeleton_2/include/CGAL/Straight_skeleton_2/Straight_skeleton_builder_traits_2_aux.h +++ b/Straight_skeleton_2/include/CGAL/Straight_skeleton_2/Straight_skeleton_builder_traits_2_aux.h @@ -152,6 +152,7 @@ public: } Protect_FPU_rounding P(CGAL_FE_TONEAREST); + CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); EC_result_type er = Exact_construction(To_Exact(std::forward(a))...) ; return From_Exact(er); }