Rounding mode switching side-effects
- 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