У мене велика модель (~ 5000 рядків), написана на C. Це серійна програма, де ніде не утворюється випадкових чисел. Він використовує бібліотеку FFTW для функцій, що використовують FFT - я не знаю деталей реалізації FFTW, але я припускаю, що функції в ньому також детерміновані (виправте мене, якщо я помиляюся).
Проблема, яку я не можу зрозуміти, полягає в тому, що я отримую невеликі відмінності в результатах для однакових прогонів на одній машині (той же компілятор, ті ж бібліотеки).
Я використовую змінні з подвійною точністю, і для виведення результату в змінну, value
наприклад, видаю:
fprintf(outFID, "%.15e\n", value);
або
fwrite(&value, 1, sizeof(double), outFID);
І я постійно отримував би різниці, такі як:
2.07843469652206 4 e-16 проти 2.07843469652206 3 e-16
Я витратив багато часу, намагаючись зрозуміти, чому це. Спочатку я вважав, що одна з моїх мікросхем пам'яті пішла погано, і я замовив і замінив їх безрезультатно. Згодом я також спробував запустити свій код на машині Linux колеги, і я отримав однакові відмінності.
Що може бути причиною цього? Зараз це невелике питання, але мені цікаво, чи це "верхівка айсберга" (серйозна проблема).
Я думав, що опублікую тут замість StackOverflow, якщо хтось, хто працює з числовими моделями, натрапив на цю проблему. Якщо хтось може пролити світло на це, я був би дуже зобов'язаний.
Продовження коментарів:
Крістіан Класон та Вікрам: по-перше, дякую за увагу до мого запитання. У статтях, до яких ви посилаєтесь, висловлюється думка, що: 1. помилки округлення обмежують точність, і 2. різний код (наприклад, введення начебто нешкідливих тверджень про друк) може впливати на результати аж до епсилону машини. Я повинен уточнити, що я не порівнюю ефекти fwrite
та fprintf
функції. Я використовую одне АБО інше. Зокрема, для обох запусків використовується однаковий виконуваний файл. Я просто констатую, що питання виникає, чи використовую я fprintf
АБО fwrite
.
Таким чином, шлях коду (і виконуваний файл) однаковий, а апаратне забезпечення - те саме. З урахуванням усіх цих зовнішніх факторів, звідки взагалі береться випадковість? Я підозрював, що біт перевертання відбулося через те, що несправна пам'ять не збереглася належним чином, саме тому я замінив мікросхеми пам'яті, але це, здається, не проблема тут, я перевірив і ви вказали. Моя програма виводить тисячі цих чисел з подвійною точністю за один пробіг, і завжди є випадкова жменька, яка має випадкові бітові фліпи.
Подальший номер 2 :
Це графік виведення часових рядів за допомогою моделі, що сприяє обговоренню в коментарях.