check that the rounding mode when doing exact computation is to-nearest

This commit is contained in:
Sébastien Loriot 2021-09-09 11:01:03 +02:00
parent 106645ec2e
commit c8624ee0b3
12 changed files with 41 additions and 4 deletions

View File

@ -359,6 +359,8 @@ public:
} }
} }
catch (Uncertain_conversion_exception&){} catch (Uncertain_conversion_exception&){}
Protector protector(CGAL_FE_TONEAREST);
CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST);
if (ek_plane_ptr==nullptr) { if (ek_plane_ptr==nullptr) {
const typename Exact_K::Point_3 ep = to_EK(p); const typename Exact_K::Point_3 ep = to_EK(p);
ek_plane_ptr = new Vector_plus_point<Exact_K>; ek_plane_ptr = new Vector_plus_point<Exact_K>;

View File

@ -55,6 +55,7 @@ public:
{} {}
} }
Protect_FPU_rounding<!Protection> P(CGAL_FE_TONEAREST); Protect_FPU_rounding<!Protection> P(CGAL_FE_TONEAREST);
CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST);
return From_Exact( Exact_construction(To_Exact(a1)) ); return From_Exact( Exact_construction(To_Exact(a1)) );
} }
template <class A1, class A2> template <class A1, class A2>
@ -72,6 +73,7 @@ public:
{} {}
} }
Protect_FPU_rounding<!Protection> P(CGAL_FE_TONEAREST); Protect_FPU_rounding<!Protection> P(CGAL_FE_TONEAREST);
CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST);
return From_Exact( Exact_construction(To_Exact(a1), return From_Exact( Exact_construction(To_Exact(a1),
To_Exact(a2)) ); To_Exact(a2)) );
} }
@ -92,6 +94,7 @@ public:
{} {}
} }
Protect_FPU_rounding<!Protection> P(CGAL_FE_TONEAREST); Protect_FPU_rounding<!Protection> P(CGAL_FE_TONEAREST);
CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST);
return From_Exact( Exact_construction(To_Exact(a1), return From_Exact( Exact_construction(To_Exact(a1),
To_Exact(a2), To_Exact(a2),
To_Exact(a3)) ); To_Exact(a3)) );

View File

@ -103,6 +103,7 @@ Filtered_predicate<EP,AP,C2E,C2A,Protection>::
} }
CGAL_BRANCH_PROFILER_BRANCH(tmp); CGAL_BRANCH_PROFILER_BRANCH(tmp);
Protect_FPU_rounding<!Protection> p(CGAL_FE_TONEAREST); Protect_FPU_rounding<!Protection> p(CGAL_FE_TONEAREST);
CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST);
return ep(c2e(args)...); return ep(c2e(args)...);
} }

View File

@ -74,6 +74,7 @@ Filtered_predicate_with_state<EP,AP,C2E,C2A,O1,Protection>::
} }
CGAL_BRANCH_PROFILER_BRANCH(tmp); CGAL_BRANCH_PROFILER_BRANCH(tmp);
Protect_FPU_rounding<!Protection> p(CGAL_FE_TONEAREST); Protect_FPU_rounding<!Protection> p(CGAL_FE_TONEAREST);
CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST);
if(! oep){ if(! oep){
#if BOOST_VERSION < 105600 #if BOOST_VERSION < 105600
oep = EP(c2e(o1)); oep = EP(c2e(o1));

View File

@ -803,6 +803,7 @@ struct Lazy_construction_bbox
} }
CGAL_BRANCH_PROFILER_BRANCH(tmp); CGAL_BRANCH_PROFILER_BRANCH(tmp);
Protect_FPU_rounding<!Protection> P2(CGAL_FE_TONEAREST); Protect_FPU_rounding<!Protection> P2(CGAL_FE_TONEAREST);
CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST);
return ec(CGAL::exact(l1)); return ec(CGAL::exact(l1));
} }
}; };
@ -851,6 +852,7 @@ struct Lazy_construction_nt {
} }
CGAL_BRANCH_PROFILER_BRANCH(tmp); CGAL_BRANCH_PROFILER_BRANCH(tmp);
Protect_FPU_rounding<!Protection> P2(CGAL_FE_TONEAREST); Protect_FPU_rounding<!Protection> P2(CGAL_FE_TONEAREST);
CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST);
return new Lazy_rep_0<AT,ET,To_interval<ET> >(ec( CGAL::exact(l)... )); return new Lazy_rep_0<AT,ET,To_interval<ET> >(ec( CGAL::exact(l)... ));
} }
@ -1076,6 +1078,7 @@ public:
} }
CGAL_BRANCH_PROFILER_BRANCH(tmp); CGAL_BRANCH_PROFILER_BRANCH(tmp);
Protect_FPU_rounding<!Protection> P2(CGAL_FE_TONEAREST); Protect_FPU_rounding<!Protection> P2(CGAL_FE_TONEAREST);
CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST);
typename R1::ET et; typename R1::ET et;
ec(CGAL::exact(l1), CGAL::exact(l2), et); ec(CGAL::exact(l1), CGAL::exact(l2), et);
r1 = R1(new Lazy_rep_0<typename R1::AT,typename R1::ET,E2A>(et)); r1 = R1(new Lazy_rep_0<typename R1::AT,typename R1::ET,E2A>(et));
@ -1147,6 +1150,7 @@ public:
} }
CGAL_BRANCH_PROFILER_BRANCH(tmp); CGAL_BRANCH_PROFILER_BRANCH(tmp);
Protect_FPU_rounding<!Protection> P2(CGAL_FE_TONEAREST); Protect_FPU_rounding<!Protection> P2(CGAL_FE_TONEAREST);
CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST);
typename R1::ET et1, et2; typename R1::ET et1, et2;
ec(CGAL::exact(l1), CGAL::exact(l2), et1, et2); ec(CGAL::exact(l1), CGAL::exact(l2), et1, et2);
r1 = R1(Handle_1(new Lazy_rep_0<typename R1::AT,typename R1::ET,E2A>(et1))); r1 = R1(Handle_1(new Lazy_rep_0<typename R1::AT,typename R1::ET,E2A>(et1)));
@ -1205,6 +1209,7 @@ public:
CGAL_BRANCH_PROFILER_BRANCH(tmp); CGAL_BRANCH_PROFILER_BRANCH(tmp);
// TODO: Instead of using a vector, write an iterator adapter // TODO: Instead of using a vector, write an iterator adapter
Protect_FPU_rounding<!Protection> P2(CGAL_FE_TONEAREST); Protect_FPU_rounding<!Protection> P2(CGAL_FE_TONEAREST);
CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST);
std::vector<Object> exact_objects; std::vector<Object> exact_objects;
ec(CGAL::exact(l1), CGAL::exact(l2), std::back_inserter(exact_objects)); ec(CGAL::exact(l1), CGAL::exact(l2), std::back_inserter(exact_objects));
for (std::vector<Object>::const_iterator oit = exact_objects.begin(); for (std::vector<Object>::const_iterator oit = exact_objects.begin();
@ -1283,6 +1288,7 @@ public:
} }
CGAL_BRANCH_PROFILER_BRANCH(tmp); CGAL_BRANCH_PROFILER_BRANCH(tmp);
Protect_FPU_rounding<!Protection> P2(CGAL_FE_TONEAREST); Protect_FPU_rounding<!Protection> P2(CGAL_FE_TONEAREST);
CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST);
ET eto = ec(CGAL::exact(l1)); ET eto = ec(CGAL::exact(l1));
return make_lazy<LK>(eto); return make_lazy<LK>(eto);
} }
@ -1338,6 +1344,7 @@ public:
} }
CGAL_BRANCH_PROFILER_BRANCH(tmp); CGAL_BRANCH_PROFILER_BRANCH(tmp);
Protect_FPU_rounding<!Protection> P2(CGAL_FE_TONEAREST); Protect_FPU_rounding<!Protection> P2(CGAL_FE_TONEAREST);
CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST);
ET eto = ec(CGAL::exact(l1), CGAL::exact(l2)); ET eto = ec(CGAL::exact(l1), CGAL::exact(l2));
return make_lazy<LK>(eto); return make_lazy<LK>(eto);
} }
@ -1371,6 +1378,7 @@ public:
} }
CGAL_BRANCH_PROFILER_BRANCH(tmp); CGAL_BRANCH_PROFILER_BRANCH(tmp);
Protect_FPU_rounding<!Protection> P2(CGAL_FE_TONEAREST); Protect_FPU_rounding<!Protection> 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)); ET eto = ec(CGAL::exact(l1), CGAL::exact(l2), CGAL::exact(l3));
return make_lazy<LK>(eto); return make_lazy<LK>(eto);
} }
@ -1544,7 +1552,7 @@ struct Lazy_construction_variant {
} }
CGAL_BRANCH_PROFILER_BRANCH(tmp); CGAL_BRANCH_PROFILER_BRANCH(tmp);
Protect_FPU_rounding<!Protection> P2(CGAL_FE_TONEAREST); Protect_FPU_rounding<!Protection> P2(CGAL_FE_TONEAREST);
CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST);
ET exact_v = EC()(CGAL::exact(l1), CGAL::exact(l2)); ET exact_v = EC()(CGAL::exact(l1), CGAL::exact(l2));
result_type res; result_type res;
@ -1594,7 +1602,7 @@ struct Lazy_construction_variant {
} }
CGAL_BRANCH_PROFILER_BRANCH(tmp); CGAL_BRANCH_PROFILER_BRANCH(tmp);
Protect_FPU_rounding<!Protection> P2(CGAL_FE_TONEAREST); Protect_FPU_rounding<!Protection> 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)); ET exact_v = EC()(CGAL::exact(l1), CGAL::exact(l2), CGAL::exact(l3));
result_type res; result_type res;
@ -1646,6 +1654,7 @@ struct Lazy_construction<LK, AC, EC, E2A_, true> {
} \ } \
CGAL_BRANCH_PROFILER_BRANCH(tmp); \ CGAL_BRANCH_PROFILER_BRANCH(tmp); \
Protect_FPU_rounding<!Protection> P2(CGAL_FE_TONEAREST); \ Protect_FPU_rounding<!Protection> P2(CGAL_FE_TONEAREST); \
CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); \
return result_type( Handle(new Lazy_rep_0<AT,ET,E2A>(ec( BOOST_PP_ENUM(n, CGAL_LEXACT, _) ))) ); \ return result_type( Handle(new Lazy_rep_0<AT,ET,E2A>(ec( BOOST_PP_ENUM(n, CGAL_LEXACT, _) ))) ); \
} }
@ -1714,6 +1723,7 @@ struct result<F( BOOST_PP_ENUM_PARAMS(n, T) )> { \
} \ } \
CGAL_BRANCH_PROFILER_BRANCH(tmp); \ CGAL_BRANCH_PROFILER_BRANCH(tmp); \
Protect_FPU_rounding<!Protection> P2(CGAL_FE_TONEAREST); \ Protect_FPU_rounding<!Protection> P2(CGAL_FE_TONEAREST); \
CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST); \
return result_type( Handle(new Lazy_rep_0<AT,ET,E2A>(ec( BOOST_PP_ENUM(n, CGAL_LEXACT, _) ))) ); \ return result_type( Handle(new Lazy_rep_0<AT,ET,E2A>(ec( BOOST_PP_ENUM(n, CGAL_LEXACT, _) ))) ); \
} }

View File

@ -403,6 +403,7 @@ int orientation(const Extended_point<RT>& p1,
run_exact=true; run_exact=true;
} }
} }
CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST);
if (run_exact) if (run_exact)
res = orientation_coeff2(p1.mx(),p1.nx(),p1.my(),p1.ny(),p1.hw(), res = orientation_coeff2(p1.mx(),p1.nx(),p1.my(),p1.ny(),p1.hw(),
p2.mx(),p2.nx(),p2.my(),p2.ny(),p2.hw(), p2.mx(),p2.nx(),p2.my(),p2.ny(),p2.hw(),
@ -422,6 +423,7 @@ int orientation(const Extended_point<RT>& p1,
run_exact = true; run_exact = true;
} }
} }
CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST);
if (run_exact) if (run_exact)
res = orientation_coeff1(p1.mx(),p1.nx(),p1.my(),p1.ny(),p1.hw(), res = orientation_coeff1(p1.mx(),p1.nx(),p1.my(),p1.ny(),p1.hw(),
p2.mx(),p2.nx(),p2.my(),p2.ny(),p2.hw(), p2.mx(),p2.nx(),p2.my(),p2.ny(),p2.hw(),
@ -441,6 +443,7 @@ int orientation(const Extended_point<RT>& p1,
run_exact = true; run_exact = true;
} }
} }
CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST);
if (run_exact) if (run_exact)
res = orientation_coeff0(p1.mx(),p1.nx(),p1.my(),p1.ny(),p1.hw(), res = orientation_coeff0(p1.mx(),p1.nx(),p1.my(),p1.ny(),p1.hw(),
p2.mx(),p2.nx(),p2.my(),p2.ny(),p2.hw(), p2.mx(),p2.nx(),p2.my(),p2.ny(),p2.hw(),
@ -473,6 +476,7 @@ int compare_x(const Extended_point<RT>& p1,
run_exact = true; run_exact = true;
} }
} }
CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST);
if (run_exact) if (run_exact)
res = compare_expr(p1.mx(),p1.hw(),p2.mx(),p2.hw()); res = compare_expr(p1.mx(),p1.hw(),p2.mx(),p2.hw());
@ -490,6 +494,7 @@ int compare_x(const Extended_point<RT>& p1,
run_exact = true; run_exact = true;
} }
} }
CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST);
if (run_exact) if (run_exact)
res = compare_expr(p1.nx(),p1.hw(),p2.nx(),p2.hw()); res = compare_expr(p1.nx(),p1.hw(),p2.nx(),p2.hw());
return res; return res;
@ -514,6 +519,7 @@ int compare_y(const Extended_point<RT>& p1,
run_exact = true; run_exact = true;
} }
} }
CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST);
if (run_exact) if (run_exact)
res = compare_expr(p1.my(),p1.hw(),p2.my(),p2.hw()); res = compare_expr(p1.my(),p1.hw(),p2.my(),p2.hw());
if ( res != 0 ) return res; if ( res != 0 ) return res;
@ -529,6 +535,7 @@ int compare_y(const Extended_point<RT>& p1,
run_exact = true; run_exact = true;
} }
} }
CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST);
if (run_exact) if (run_exact)
res = compare_expr(p1.ny(),p1.hw(),p2.ny(),p2.hw()); res = compare_expr(p1.ny(),p1.hw(),p2.ny(),p2.hw());
return res; return res;
@ -673,6 +680,7 @@ int compare_pair_dist(
run_exact = true; run_exact = true;
} }
} }
CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST);
if (run_exact) if (run_exact)
res = cmppd_coeff2(p1.mx(),p1.nx(),p1.my(),p1.ny(),p1.hw(), res = cmppd_coeff2(p1.mx(),p1.nx(),p1.my(),p1.ny(),p1.hw(),
p2.mx(),p2.nx(),p2.my(),p2.ny(),p2.hw(), p2.mx(),p2.nx(),p2.my(),p2.ny(),p2.hw(),
@ -695,6 +703,7 @@ int compare_pair_dist(
run_exact = true; run_exact = true;
} }
} }
CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST);
if (run_exact) if (run_exact)
res = cmppd_coeff1(p1.mx(),p1.nx(),p1.my(),p1.ny(),p1.hw(), res = cmppd_coeff1(p1.mx(),p1.nx(),p1.my(),p1.ny(),p1.hw(),
p2.mx(),p2.nx(),p2.my(),p2.ny(),p2.hw(), p2.mx(),p2.nx(),p2.my(),p2.ny(),p2.hw(),
@ -716,6 +725,7 @@ int compare_pair_dist(
run_exact = true; run_exact = true;
} }
} }
CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST);
if (run_exact) if (run_exact)
res = cmppd_coeff0(p1.mx(),p1.nx(),p1.my(),p1.ny(),p1.hw(), res = cmppd_coeff0(p1.mx(),p1.nx(),p1.my(),p1.ny(),p1.hw(),
p2.mx(),p2.nx(),p2.my(),p2.ny(),p2.hw(), p2.mx(),p2.nx(),p2.my(),p2.ny(),p2.hw(),
@ -959,6 +969,7 @@ int orientation(const Extended_direction<RT>& d1,
run_exact=true; run_exact=true;
} }
} }
CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST);
if (run_exact) if (run_exact)
res = coeff2_dor(p1.mx(),p1.nx(),p1.my(),p1.ny(),p1.hw(), res = coeff2_dor(p1.mx(),p1.nx(),p1.my(),p1.ny(),p1.hw(),
p2.mx(),p2.nx(),p2.my(),p2.ny(),p2.hw(), p2.mx(),p2.nx(),p2.my(),p2.ny(),p2.hw(),
@ -979,6 +990,7 @@ int orientation(const Extended_direction<RT>& d1,
run_exact=true; run_exact=true;
} }
} }
CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST);
if (run_exact) if (run_exact)
res = coeff1_dor(p1.mx(),p1.nx(),p1.my(),p1.ny(),p1.hw(), res = coeff1_dor(p1.mx(),p1.nx(),p1.my(),p1.ny(),p1.hw(),
p2.mx(),p2.nx(),p2.my(),p2.ny(),p2.hw(), p2.mx(),p2.nx(),p2.my(),p2.ny(),p2.hw(),
@ -1000,6 +1012,7 @@ int orientation(const Extended_direction<RT>& d1,
run_exact = true; run_exact = true;
} }
} }
CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST);
if(run_exact) if(run_exact)
res = coeff0_dor(p1.mx(),p1.nx(),p1.my(),p1.ny(),p1.hw(), res = coeff0_dor(p1.mx(),p1.nx(),p1.my(),p1.ny(),p1.hw(),
p2.mx(),p2.nx(),p2.my(),p2.ny(),p2.hw(), p2.mx(),p2.nx(),p2.my(),p2.ny(),p2.hw(),

View File

@ -48,6 +48,7 @@ struct Cartesian_filter_NT : public Base_
if(is_certain(res)) return get_certain(res); if(is_certain(res)) return get_certain(res);
} catch (Uncertain_conversion_exception&) {} } catch (Uncertain_conversion_exception&) {}
} }
CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST);
return p2(std::forward<U>(u)...); return p2(std::forward<U>(u)...);
} }
}; };

View File

@ -88,6 +88,7 @@ public:
} }
CGAL_BRANCH_PROFILER_BRANCH(tmp); CGAL_BRANCH_PROFILER_BRANCH(tmp);
Protect_FPU_rounding<!Protection> p(CGAL_FE_TONEAREST); Protect_FPU_rounding<!Protection> p(CGAL_FE_TONEAREST);
CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST);
return ep(c2e(std::forward<Args>(args))...); return ep(c2e(std::forward<Args>(args))...);
} }
}; };

View File

@ -184,6 +184,7 @@ struct Lazy_construction2 {
} }
CGAL_BRANCH_PROFILER_BRANCH(tmp); CGAL_BRANCH_PROFILER_BRANCH(tmp);
Protect_FPU_rounding<!Protection> P2(CGAL_FE_TONEAREST); Protect_FPU_rounding<!Protection> P2(CGAL_FE_TONEAREST);
CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST);
return new Lazy_rep_0<AT,ET,E2A>(ec(CGAL::exact(l)...)); return new Lazy_rep_0<AT,ET,E2A>(ec(CGAL::exact(l)...));
} }
// FIXME: this forces us to have default constructors for all types, try to make its instantiation lazier // FIXME: this forces us to have default constructors for all types, try to make its instantiation lazier

View File

@ -313,7 +313,7 @@ sign(TMC_Vertex_handle vit) const
} }
CGAL_BRANCH_PROFILER_BRANCH(tmp); CGAL_BRANCH_PROFILER_BRANCH(tmp);
Protect_FPU_rounding<false> P(CGAL_FE_TONEAREST); Protect_FPU_rounding<false> P(CGAL_FE_TONEAREST);
CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST);
typedef Exact_predicates_exact_constructions_kernel EK; typedef Exact_predicates_exact_constructions_kernel EK;
typedef Skin_surface_traits_3<EK> Exact_skin_surface_traits; typedef Skin_surface_traits_3<EK> Exact_skin_surface_traits;
typedef Skin_surface_base_3<Exact_skin_surface_traits> Exact_skin_surface_base; typedef Skin_surface_base_3<Exact_skin_surface_traits> Exact_skin_surface_base;
@ -355,6 +355,7 @@ sign(const Bare_point &p, const Cell_info &info) const
} }
CGAL_BRANCH_PROFILER_BRANCH(tmp); CGAL_BRANCH_PROFILER_BRANCH(tmp);
Protect_FPU_rounding<false> P(CGAL_FE_TONEAREST); Protect_FPU_rounding<false> P(CGAL_FE_TONEAREST);
CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST);
return construct_surface(info.first, return construct_surface(info.first,
Exact_predicates_exact_constructions_kernel()).sign(p); Exact_predicates_exact_constructions_kernel()).sign(p);
} }
@ -630,7 +631,7 @@ compare(Cell_info &info1, const Bare_point &p1,
} }
CGAL_BRANCH_PROFILER_BRANCH(tmp); CGAL_BRANCH_PROFILER_BRANCH(tmp);
Protect_FPU_rounding<false> P(CGAL_FE_TONEAREST); Protect_FPU_rounding<false> P(CGAL_FE_TONEAREST);
CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST);
return CGAL_NTS sign( return CGAL_NTS sign(
construct_surface(info1.first, construct_surface(info1.first,
Exact_predicates_exact_constructions_kernel()).value(p1) - 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]); *pts[2], *pts[3]);
} catch (Uncertain_conversion_exception&) { run_exact=true; } } catch (Uncertain_conversion_exception&) { run_exact=true; }
} }
CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST);
if (run_exact) if (run_exact)
{ {
Protect_FPU_rounding<false> P(CGAL_FE_TONEAREST); Protect_FPU_rounding<false> P(CGAL_FE_TONEAREST);

View File

@ -1210,6 +1210,7 @@ orientation(Tmc_Cell_handle ch)
} catch (Uncertain_conversion_exception&) {} } catch (Uncertain_conversion_exception&) {}
} }
Protect_FPU_rounding<false> P(CGAL_FE_TONEAREST); Protect_FPU_rounding<false> P(CGAL_FE_TONEAREST);
CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST);
typedef Exact_predicates_exact_constructions_kernel EK; typedef Exact_predicates_exact_constructions_kernel EK;
typedef Cartesian_converter<EK, Tmc_traits> Exact_converter; typedef Cartesian_converter<EK, Tmc_traits> Exact_converter;
typedef Skin_surface_traits_3<EK> Exact_traits; typedef Skin_surface_traits_3<EK> Exact_traits;

View File

@ -152,6 +152,7 @@ public:
} }
Protect_FPU_rounding<!Protection> P(CGAL_FE_TONEAREST); Protect_FPU_rounding<!Protection> P(CGAL_FE_TONEAREST);
CGAL_expensive_assertion(FPU_get_cw() == CGAL_FE_TONEAREST);
EC_result_type er = Exact_construction(To_Exact(std::forward<A>(a))...) ; EC_result_type er = Exact_construction(To_Exact(std::forward<A>(a))...) ;
return From_Exact(er); return From_Exact(er);
} }