Gecode / Gecode/gecode

Rounding mode switching side-effects

Đang mở
#155 3 bình luận 0 reaction 0 người được giao Xem trên GitHub
Ngôn ngữ chính
C++
Star
335
Fork
88
Merge trung bình
1 giờ 28 phút
Pull request đã merge (30 ngày)
1

Mô tả

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.

Hướng dẫn đóng góp

Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này

Hướng nghiên cứu

Bắt đầu bằng cách tái hiện trường hợp solver FloatVars trên Linux x64 và kiểm tra các entry point get_rounding_mode và set_rounding_mode của Gecode::Float::Rounding. So sánh chế độ làm tròn trước và sau khi solver chạy; được xem là hoàn thành khi solver khôi phục chế độ làm tròn ban đầu của bên gọi.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
cpp
Lĩnh vực
backend
Loại issue
Lỗi
Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức độ hoạt động
Đình trệ
Độ rõ ràng
Khá rõ ràng
Mức phù hợp với người mới
35/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.