나는 C로 작성된 크기 조정 가능한 모델 (~ 5000 줄)을 가지고 있습니다. 이것은 임의의 숫자 생성이없는 직렬 프로그램입니다. FFT를 사용하는 함수에 FFTW 라이브러리를 사용합니다. FFTW 구현의 세부 사항을 알지 못하지만 그 함수가 결정적이라고 가정합니다 (오류가있는 경우 수정하십시오).
내가 이해할 수없는 문제는 동일한 컴퓨터 (동일한 컴파일러, 동일한 라이브러리)에서 동일한 실행 결과에 약간의 차이가 있다는 것입니다.
I는 배정도 변수를 사용하고, 변수의 결과 출력 value
예를 들어, I는 발행 :
fprintf(outFID, "%.15e\n", value);
또는
fwrite(&value, 1, sizeof(double), outFID);
그리고 나는 지속적으로 다음과 같은 차이점을 얻을 것입니다 :
2.07843469652206 4 e-16 대 2.07843469652206 3 e-16
나는 이것이 왜 그런지 알아 내려고 많은 시간을 보냈습니다. 나는 처음에 내 메모리 칩 중 하나가 잘못되었다고 생각하고 주문하고 교체했지만 아무 소용이 없었습니다. 그 후 동료의 Linux 컴퓨터에서 코드를 실행하려고 시도했지만 동일한 특성의 차이점을 얻었습니다.
이 문제의 원인은 무엇입니까? 지금은 작은 문제이지만, 그것이 심각한 문제인 "빙산의 일각"인지 궁금합니다.
수치 모델을 사용하는 사람 이이 문제를 겪을 수 있으므로 StackOverflow 대신 여기에 게시 할 것이라고 생각했습니다. 누구든지 이것에 대해 밝힐 수 있다면 나는 많은 의무를 져야 할 것입니다.
후속 의견 :
Christian Clason과 Vikram : 우선, 내 질문에 관심을 가져 주셔서 감사합니다. 1. 반올림 오류는 정확도를 제한하며, 2. 다른 코드 (예 : 무해한 인쇄 문 소개)는 기계 엡실론까지 결과에 영향을 줄 수 있습니다. 나는 효과 fwrite
와 fprintf
기능을 비교하지 않는다는 것을 분명히해야 합니다. 하나 또는 다른 것을 사용하고 있습니다. 특히 동일한 실행 파일이 두 실행에 모두 사용됩니다. fprintf
OR 사용 여부에 관계없이 문제가 발생한다고 간단히 말하고 있습니다 fwrite
.
따라서 코드 경로 (및 실행 파일)는 동일하며 하드웨어는 동일합니다. 이러한 모든 외부 요인들이 일정하게 유지되면서 무작위성은 어디에서 오는가? 결함이있는 메모리가 비트를 올바르게 유지하지 않아 비트 플립이 발생했다고 의심했기 때문에 메모리 칩을 교체 한 이유는 여기에서 문제가되지 않는 것으로 확인되었습니다. 내 프로그램은 한 번의 실행으로 수천 배의 배정도 숫자를 출력하며 임의의 비트 플립을 갖는 임의의 소수가 항상 있습니다.
기독교 Clason 최초의 코멘트에 후속 : 왜 기계 정밀도 내에서 0과 동일? 더블에 대한 가장 작은 양수는 2.22e-308이므로 0과 같지 않아야합니까? 내 프로그램은 10 ^ -16 범위 (1e-15에서 8e-17 범위)에서 수천 개의 값을 출력하며 연구 프로젝트에서 의미있는 변화를 보았으므로 우리는 비의 미적이지 않은 것을 보지 않았기를 바랍니다. 번호.
Followup # 2 :
이것은 주석에서 파생 된 토론을 돕기 위해 모델에 의해 출력 된 시계열의 도표입니다.