J'ai un modèle non négligeable (~ 5000 lignes) écrit en C. C'est un programme en série, sans génération de nombre aléatoire nulle part. Il utilise la bibliothèque FFTW pour les fonctions utilisant FFT - Je ne connais pas les détails de l'implémentation FFTW, mais je suppose que les fonctions y sont également déterministes (corrigez-moi si je me trompe).
Le problème que je ne peux pas comprendre est que j'obtiens de petites différences dans les résultats pour des exécutions identiques sur la même machine (même compilateur, mêmes bibliothèques).
J'utilise des variables de double précision, et pour sortir le résultat en variable value
par exemple, j'émets:
fprintf(outFID, "%.15e\n", value);
ou
fwrite(&value, 1, sizeof(double), outFID);
Et j'obtiendrais constamment des différences telles que:
2.07843469652206 4 e-16 contre 2.07843469652206 3 e-16
J'ai passé beaucoup de temps à essayer de comprendre pourquoi. J'ai d'abord pensé qu'une de mes puces mémoire avait mal tourné, et je les ai commandées et remplacées, en vain. Par la suite, j'ai également essayé d'exécuter mon code sur la machine Linux d'un collègue, et j'obtiens des différences de même nature.
Qu'est-ce qui peut causer cela? C'est un petit problème maintenant, mais je me demande si c'est la "pointe de l'iceberg" (d'un problème grave).
Je pensais que je publierais ici au lieu de StackOverflow au cas où quelqu'un travaillant avec des modèles numériques aurait pu rencontrer ce problème. Si quelqu'un peut faire la lumière là-dessus, je serais très obligé.
Suivi des commentaires:
Christian Clason et Vikram: tout d'abord, merci de votre attention à ma question. Les articles que vous avez liés suggèrent que: 1. les erreurs d'arrondi limitent la précision, et 2. un code différent (tel que l'introduction d'instructions d'impression apparemment inoffensives) peut affecter les résultats jusqu'à la machine epsilon. Je dois préciser que je ne compare pas les effets fwrite
et les fprintf
fonctions. J'utilise l'un OU l'autre. En particulier, le même exécutable est utilisé pour les deux exécutions. Je déclare simplement que le problème se produit si j'utilise fprintf
OR fwrite
.
Ainsi, le chemin du code (et l'exécutable) est le même et le matériel est le même. Avec tous ces facteurs externes maintenus constants, d'où vient l'aléatoire, fondamentalement? Je soupçonnais que le retournement de bits était dû à une mémoire défectueuse qui ne se retenait pas correctement, c'est pourquoi j'ai remplacé les puces de mémoire, mais cela ne semble pas être le problème ici, j'ai vérifié et vous l'avez indiqué. Mon programme génère des milliers de ces nombres en double précision en une seule fois, et il y a toujours une poignée aléatoire qui a des retournements de bits aléatoires.
Suivi du premier commentaire de Christian Clason: Pourquoi -il identique à 0 dans la précision de la machine? Le plus petit nombre positif pour un double est 2,22e-308, alors cela ne devrait-il pas être égal à 0? Mon programme génère des milliers de valeurs dans la gamme 10 ^ -16 (allant de 1e-15 à 8e-17) et nous avons vu des variations significatives dans notre projet de recherche, donc j'espère que nous n'avons pas regardé de manière absurde Nombres.
Suivi # 2 :
Ceci est un tracé de la série chronologique produite par le modèle, pour aider à la discussion de ramification dans les commentaires.