2013-06-20 20 views
5

Tôi đang trong quá trình chuyển một chương trình cửa sổ sang Linux và đã bị chặn trên đoạn mã cụ thể của msvc có vẻ như kiểm tra các hoạt động điểm nổi đã đưa ra một sự không bình thường hoặc kết quả không chính xác. Tôi rất không chắc chắn về cách thực hiện nó một cách mạnh mẽ. Tôi nên thêm rằng tôi khá thiếu kinh nghiệm khi nói đến cả hai lập trình cụ thể cho Linux và các hoạt động cấp thấp như thế này.Phát hiện các hoạt động nổi bất thường trên Linux cho x86

Cụ thể, phần đó mang lại cho tôi rắc rối như sau:

if (_statusfp() & (_SW_INEXACT | _SW_DENORMAL)) 
    { 
    ... portable stuff ... 
    } 

    _clearfp(); 

Trong khi fenv.h dường như cung cấp khả năng cả hai rõ ràng cờ tình trạng và kiểm tra các lá cờ không chính xác, nó không có vẻ cung cấp bất kỳ hỗ trợ nào trong việc kiểm tra cờ không chính xác. Hơn nữa, tôi đã có nó gợi ý với tôi rằng gcc có thể xử lý các hoạt động điểm nổi khác nhau đủ để một cổng thẳng đơn giản của đoạn mã này có thể không thực hiện được. Tôi rất biết ơn vì sự giúp đỡ nào trong việc này.

Nếu nó có liên quan, điều này được sử dụng trong một phần crunching số rất nặng của chương trình mà vấn đề hiệu suất.

Chỉnh sửa: Cờ trong fenv.h được gọi là FE_UNDERFLOW dường như được nâng lên khi kết quả không chính xác được tạo theo http://en.cppreference.com/w/cpp/numeric/fenv/FE_exceptions, nhưng đã thấy một số nguồn khác cho biết rằng nó chỉ được nâng lên khi kết quả quá nhỏ ngay cả đối với một subnormal . Sẽ chạy thử nghiệm để xem nếu nó làm những gì tôi cần nó quá và và trả lời bản thân mình nếu như vậy.

+1

Điều này có hữu ích không? http://stackoverflow.com/questions/16849009/in-the-linux-is-or-not-exists-some-functions-be-similar-to-clearfp-and-stat – doctorlove

Trả lời

0

Như đã nói trong câu hỏi, có vẻ như fenv.h có cờ FE_UNDERFLOW trên một số kiến ​​trúc ít nhất là biểu thị kết quả bình thường/không bình thường. Thử nghiệm của riêng tôi cho thấy rằng điều này có vẻ là trường hợp trên kiến ​​trúc x86 thử nghiệm của tôi, vì vậy tôi sẽ tiếp tục và sử dụng nó ngay bây giờ trừ khi một giải pháp tốt hơn được cung cấp.

1

Có phải C++ 11 là tùy chọn cho bạn không? Nếu có, có lẽ bạn có thể gọi std::isnormal về kết quả, xem ví dụ: http://en.cppreference.com/w/cpp/numeric/math/isnormal.

+0

Có vẻ như bạn có thể lấy nó từ Boost ngay cả khi bạn không có C++ 11: http://www.boost.org/doc/libs/1_41_0/libs/math/doc/sf_and_dist/html/math_toolkit/utils/fpclass.html –

+0

Xin lỗi, mã này cơ sở vẫn cần biên dịch cho C++ 03 ngay bây giờ. Ngoài ra, hoạt động này dường như phát hiện nếu bất kỳ kết quả bất thường nào đã được sinh ra từ phép nhân ma trận. Lặp đi lặp lại thông qua toàn bộ ma trận kết quả để xem liệu bất kỳ giá trị nào là không bình thường sẽ là lựa chọn duy nhất của tôi và rất có thể là quá chậm, vì đây là một tối ưu hóa tốc độ ngay từ đầu. –

Các vấn đề liên quan