Tôi có một ứng dụng được phát triển cho Linux 32 bit x86. Có rất nhiều thao tác dấu phẩy động và rất nhiều thử nghiệm tùy thuộc vào kết quả. Bây giờ chúng ta đang chuyển nó sang x86_64, nhưng kết quả kiểm tra lại khác nhau trong kiến trúc này. Chúng tôi không muốn giữ một tập hợp các kết quả riêng biệt cho mỗi kiến trúc.Độ chính xác của dấu phẩy động khi di chuyển từ i386 đến x86_64
Theo bài viết An Introduction to GCC - for the GNU compilers gcc and g++ vấn đề là GCC trong x86_64 giả fpmath = SSE khi x86 giả fpmath = 387. FPU 387 sử dụng chính xác nội bộ 80 bit cho tất cả các hoạt động và chỉ chuyển đổi kết quả thành loại dấu phẩy động (nổi, đôi hoặc dài gấp đôi) trong khi SSE sử dụng loại toán hạng để xác định độ chính xác nội bộ của nó.
Tôi có thể force -mfpmath = 387 khi biên dịch mã của riêng mình và tất cả hoạt động của tôi hoạt động chính xác, nhưng bất cứ khi nào tôi gọi hàm thư viện (sin, cos, atan2, v.v.) Tôi cho rằng đó là vì libm được biên dịch mà không có ghi đè fpmath.
Tôi đã cố gắng xây dựng libm bản thân mình (glibc) bằng cách sử dụng mô phỏng 387, nhưng nó gây ra rất nhiều sự cố xung quanh (không biết nếu tôi đã làm điều gì sai).
Có cách nào để buộc tất cả mã trong quá trình sử dụng mô phỏng 387 trong x86_64 không? Hoặc có thể một số thư viện trả về cùng các giá trị như libm hiện trên cả hai kiến trúc? Bất kỳ đề xuất?
Về câu hỏi "Bạn có cần độ chính xác 80 bit" không, tôi phải nói rằng đây không phải là vấn đề đối với một hoạt động riêng lẻ. Trong trường hợp đơn giản này, sự khác biệt là rất nhỏ và không có sự khác biệt. Tuy nhiên, khi kết hợp nhiều thao tác, lỗi truyền và sai số trong kết quả cuối cùng không quá nhỏ và tạo ra sự khác biệt. Vì vậy, tôi đoán tôi cần độ chính xác 80 bit.
Chính xác. Tùy thuộc vào độ chính xác nội bộ mở rộng chỉ có thể dẫn đến đau lòng. –
Tôi đang tìm một giải pháp không yêu cầu thay đổi quá nhiều mã và tăng gấp đôi yêu cầu bộ nhớ. Nhưng, như bạn nói, điều này rõ ràng sẽ khắc phục được vấn đề. –