Đã đọc điều này question Tôi chắc chắn rằng một quy trình nhất định sử dụng dấu chấm động arithmatic với cùng một đầu vào (trên cùng một phần cứng, được biên dịch với cùng một trình biên dịch) xác định. Tôi đang xem xét một trường hợp điều này không đúng và cố gắng xác định điều gì có thể gây ra điều này.Điều gì có thể gây ra một quá trình xác định để tạo ra các lỗi dấu phẩy động
Tôi đã biên dịch một tệp thi hành và tôi đang cho nó cùng một dữ liệu, chạy trên một máy duy nhất (không đa luồng) nhưng tôi gặp lỗi khoảng 3.814697265625e-06 sau khi tìm kiếm cẩn thận thực sự bằng 1/4^9 = 1/2^18 = 1/262144. đó là khá gần với mức độ chính xác của một số điểm nổi 32-bit (khoảng 7 chữ số theo wikipedia)
Nghi ngờ của tôi là nó có liên quan đến việc tối ưu hóa đã được áp dụng cho mã. Tôi đang sử dụng trình biên dịch C++ intel và đã biến đầu cơ điểm nổi thành nhanh thay vì an toàn hoặc nghiêm ngặt. Điều này có thể làm cho một quá trình điểm nổi không xác định? Có những sự tối ưu hóa khác có thể dẫn đến hành vi này không?
EDIT: Theo đề xuất của Pax, tôi biên dịch lại mã với đầu cơ điểm động được chuyển sang an toàn và giờ đây tôi nhận được kết quả ổn định. Điều này cho phép tôi làm rõ câu hỏi này - điều đầu cơ nổi thực sự làm gì và làm sao điều này có thể gây ra cùng một nhị phân (tức là một trình biên dịch, nhiều lần chạy) để tạo ra các kết quả khác nhau khi được áp dụng cho cùng một đầu vào?
@Ben tôi đang biên soạn bằng Intel (R) C++ 11.0.061 [IA-32] và tôi đang chạy trên bộ xử lý lõi tứ của Intel.
Bộ xử lý và trình biên dịch nào? .. xin vui lòng – Ben
Nếu bạn đã tìm ra lá cờ nào đang gây ra nó, tại sao không chỉ kiểm tra tài liệu biên dịch? –
@Tal - Tôi đang gặp khó khăn trong việc tìm ra bất cứ điều gì từ tài liệu (nó chỉ nói nhanh cho phép fps và an toàn/nghiêm ngặt vô hiệu hóa nó). Điều tốt nhất tôi có thể hiểu nó, fps cho phép sắp xếp lại các hoạt động (a * c + b * c => c * (a + b)) nhưng đây là những tối ưu hóa thời gian biên dịch, kết quả nhị phân vẫn phải xác định và tôi thực sự muốn để biết chính xác lý do tại sao nó không phải là. –