Tôi có một mô hình khá lớn (~ 5000 dòng) được viết bằng C. Đây là một chương trình nối tiếp, không có tạo số ngẫu nhiên ở bất cứ đâu. Nó sử dụng thư viện FFTW cho các chức năng bằng cách sử dụng FFT - Tôi không biết chi tiết về việc triển khai FFTW, nhưng tôi cho rằng các chức năng trong đó cũng có tính xác định (sửa tôi nếu tôi mắc lỗi).
Vấn đề tôi không thể hiểu là tôi nhận được sự khác biệt nhỏ trong kết quả cho các lần chạy giống hệt nhau trên cùng một máy (cùng trình biên dịch, cùng thư viện).
Tôi sử dụng các biến có độ chính xác kép và để đưa ra kết quả trong biến value
chẳng hạn, tôi đưa ra:
fprintf(outFID, "%.15e\n", value);
hoặc
fwrite(&value, 1, sizeof(double), outFID);
Và tôi sẽ liên tục nhận được sự khác biệt, chẳng hạn như:
2.07843469652206 4 e-16 so với 2.07843469652206 3 e-16
Tôi đã dành nhiều thời gian để cố gắng tìm hiểu tại sao điều này là. Ban đầu tôi nghĩ rằng một trong những chip bộ nhớ của tôi đã bị hỏng và tôi đã đặt hàng và thay thế chúng, nhưng không có kết quả. Sau đó tôi cũng đã thử chạy mã của mình trên máy Linux của đồng nghiệp và tôi nhận được sự khác biệt có cùng bản chất.
Điều gì có thể gây ra điều này? Bây giờ nó chỉ là một vấn đề nhỏ, nhưng tôi tự hỏi liệu nó có phải là "phần nổi của tảng băng chìm" (của một vấn đề nghiêm trọng).
Tôi nghĩ rằng tôi sẽ đăng ở đây thay vì StackOverflow trong trường hợp ai đó làm việc với các mô hình số có thể gặp phải vấn đề này. Nếu bất cứ ai có thể làm sáng tỏ điều này, tôi sẽ có nhiều nghĩa vụ.
Theo dõi các bình luận:
Christian Clason và Vikram: đầu tiên, cảm ơn bạn đã quan tâm đến câu hỏi của tôi. Các bài viết bạn liên kết để đề xuất rằng: 1. lỗi làm tròn giới hạn độ chính xác và 2. mã khác nhau (chẳng hạn như đưa ra các câu lệnh in dường như vô hại) có thể ảnh hưởng đến kết quả lên tới epsilon của máy. Tôi nên làm rõ rằng tôi không so sánh các hiệu ứng fwrite
và fprintf
chức năng. Tôi đang sử dụng cái này HOẶC cái kia. Cụ thể, cùng một tệp thực thi được sử dụng cho cả hai lần chạy. Tôi chỉ đơn giản là nêu vấn đề xảy ra cho dù tôi sử dụng fprintf
HOẶC fwrite
.
Vì vậy, đường dẫn mã (và thực thi) là như nhau, và phần cứng là như nhau. Với tất cả các yếu tố bên ngoài được giữ cố định, sự ngẫu nhiên đến từ đâu, về cơ bản? Tôi nghi ngờ việc lật bit xảy ra do bộ nhớ bị lỗi không giữ lại một chút chính xác, đó là lý do tại sao tôi thay thế chip bộ nhớ, nhưng dường như đó không phải là vấn đề ở đây, tôi đã xác minh và bạn chỉ ra. Chương trình của tôi đưa ra hàng ngàn số chính xác kép này trong một lần chạy và luôn có một số ngẫu nhiên có các bit lật ngẫu nhiên.
Theo dõi nhận xét đầu tiên của Christian Clason: Tại sao giống với 0 trong độ chính xác của máy? Số dương nhỏ nhất cho một đôi là 2,22e-308, vậy không nên bằng 0? Chương trình của tôi tạo ra hàng ngàn giá trị trong phạm vi 10 ^ -16 (từ 1e-15 đến 8e-17) và chúng tôi đã thấy các biến thể có ý nghĩa trong dự án nghiên cứu của chúng tôi, vì vậy tôi hy vọng chúng tôi không nhìn vào vô nghĩa số.
Phần tiếp theo # 2 :
Đây là một âm mưu của đầu ra chuỗi thời gian theo mô hình, để hỗ trợ cho các cuộc thảo luận ngoài luồng trong các bình luận.