Gecode / Gecode/gecode

Rounding mode switching side-effects

Open
#155 3 comments 0 reactions 0 assignees View on GitHub
Dominant language
C++
Stars
335
Forks
88
Avg merge
1h 28m
Merged PRs (30d)
1

Description

When running a model involving FloatVars, the FPU rouding mode may get changed, which may cause issues with code running afterwards. This happens with Gecode 6.2.0 (I haven't checked whether this changed in 6.3 yet).

I'm not certain which platforms this applies to, but it certainly happened to me on Linux x64 and, in the past, on Windows (I wasn't able to reproduce this now).

I created the following simple "guard class" to work around this problem.
```
struct SaveRoundingState {
Gecode::Float::Rounding::rounding_mode original_rt;
SaveRoundingState() {
Gecode::Float::Rounding::get_rounding_mode(original_rt);
}
~SaveRoundingState() {
Gecode::Float::Rounding::set_rounding_mode(original_rt);
}
};
```

Using this as follows resolves the issue (including printouts of the rounding mode):
```
{
Gecode::Float::Rounding::rounding_mode rm;
Gecode::Float::Rounding::get_rounding_mode(rm);
std::cout << rm << "\n";
{
SaveRoundingState save_state;
// (run the solver)
}
Gecode::Float::Rounding::get_rounding_mode(rm);
std::cout << rm << "\n";
}
```

In any case I think that Gecode should be cleaning up by itself.

Contributor guide

No contributing guide indexed for this repository

Research direction

Start by reproducing the FloatVars solver case on Linux x64 and inspecting the Gecode::Float::Rounding get_rounding_mode and set_rounding_mode entry points. Compare the rounding mode before and after the solver runs; done means the solver restores the caller's original rounding mode.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp
Domain
backend
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.