2010-02-25 8 views
6

J'ai une application écrite en C# qui invoque également du code C. Le code C# obtient un double en tant qu'entrée, effectue des calculs sur celui-ci, le transmet au calque natif qui effectue ses propres calculs sur celui-ci, puis retourne à la couche C#.Un calcul de virgule flottante peut-il différer sur différents processeurs? (+ passant doubles entre C# et C)

Si je cours le même exe/dlls sur différentes machines (toutes sont x64 par Intel), est-il possible que le résultat final sera différent sur des machines différentes?

+2

Question intéressante ... surtout pour ceux qui se souviennent du fameux bug Pentium FDIV dans le processeur Pentium original. – Nick

Répondre

4

Si vous utilisez le (s) même (s) fichier (s), les résultats doivent être les mêmes. Cependant, il convient de noter que les calculs à virgule flottante sont généralement hautement personnalisables par un certain nombre de paramètres persistants (mode infini, mode d'arrondi, etc.). Cela signifie que la même instruction à virgule flottante peut produire des résultats différents en fonction de la combinaison actuelle de paramètres. Si votre application vérifie que tous ces paramètres sont réinitialisés aux mêmes valeurs au début de l'exécution, les résultats doivent être les mêmes. Cependant, si certains de ces paramètres ne sont pas réinitialisés ou dépendent de paramètres externes (comme les variables d'environnement), vous pourriez dans certains cas observer des résultats différents sur des machines différentes.

+0

quel type de variables d'environnement pourrait affecter les calculs en virgule flottante? –

+0

@opc: Ce serait le cas du chargeur d'application spécifique au système d'exploitation ainsi que du code de démarrage de l'application. Je dis simplement que puisque les calculs à virgule flottante sont affectés par des paramètres persistants (application-global), la configuration initiale de ces paramètres est importante. Et cela peut dépendre de n'importe quoi, y compris des variables d'environnement. – AnT

0

Le matériel lui-même devrait tous le faire de la même manière, en supposant qu'ils mettent en œuvre des opérations à virgule flottante IEEE, et je pense que la plupart (tout?) Le font.

http://en.wikipedia.org/wiki/IEEE_754-2008

0

La plupart du matériel moderne est standardisé, comme la définition de double. Vous pouvez vérifier que les deux utilisent le même type en vérifiant l'empreinte mémoire de chaque variable - par exemple sizeof (x).

Le devrait également être quelques informations à interroger dans float.h. D'après ce dont je me souviens, int tend à être plus problématique en termes de cohérence. Certains par défaut à 2 octets, d'autres à 4, mais vous pouvez toujours utiliser long pour assurer les tailles.