6 votes

Un calcul en virgule flottante peut-il différer d'un processeur à l'autre ? (+passage de doubles entre C# et C)

J'ai une application écrite en C# qui invoque également du code C. Le code C# reçoit un double en entrée, effectue quelques calculs, le transmet à la couche native qui effectue ses propres calculs, puis le renvoie à la couche C#.

Si j'exécute les mêmes exe/dlls sur différentes machines (toutes sont x64 par Intel), est-il possible que le résultat final que j'obtiendrai soit différent sur les différentes machines ?

4voto

AndreyT Points 139512

Si vous utilisez le(s) même(s) exécutable(s), les résultats devraient être les mêmes. Toutefois, il convient de noter que les calculs en 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 en virgule flottante peut produire des résultats différents en fonction de la combinaison actuelle des paramètres. Si votre application veille à ce que tous ces paramètres soient réinitialisés aux mêmes valeurs au début de l'exécution, les résultats devraient être identiques. Toutefois, si certains de ces paramètres ne sont pas réinitialisés ou s'ils dépendent de paramètres externes (comme les variables d'environnement), il se peut que, dans certaines circonstances, vous observiez des résultats différents sur des machines différentes.

0voto

Svend Points 3291

Le matériel lui-même devrait tous le faire de la même manière, en supposant qu'ils implémentent les opérations IEEE en virgule flottante, et je pense que c'est le cas de la plupart (tous ?).

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

0voto

James Points 24725

La plupart des matériels modernes sont normalisés, de même que la définition du 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).

Il devrait également y avoir des informations à interroger dans le fichier float.h.

D'après ce dont je me souviens, l'int a tendance à être plus problématique en termes de cohérence. Certains utilisent par défaut 2 octets, d'autres 4, mais vous pouvez toujours utiliser long pour garantir la taille.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X