un calcul de virgule flottante peut varier sur différents processeurs? (+ Passage double entre C # et C)
-
22-09-2019 - |
Question
J'ai une demande écrite en C # qui invoque un code C ainsi. Le code C # obtient des doubles comme une entrée, effectue quelques calculs sur elle, passer à la couche native qui exécutent ses propres calculs sur elle, et puis passe à la couche arrière C #.
Si je cours les mêmes exe / dll sur des machines différentes (elles sont toutes x64 par Intel), est-il possible que le résultat final, je vais sera différent sur des machines différentes?
La solution
Si vous utilisez le même exécutable (s), les résultats devraient être les mêmes. Cependant, il convient de noter que les calculs à virgule flottante sont généralement hautement personnalisable 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 veille à ce que tous ces paramètres sont remis à zéro aux mêmes valeurs au début de l'exécution, les résultats devraient être les mêmes. Toutefois, si certains de ces paramètres ne sont pas remis à zéro, ou dépendent des paramètres externes (comme des variables d'environnement), puis dans certaines circonstances, vous pourriez finir par observer des résultats différents sur des machines différentes.
Autres conseils
matériel lui-même devrait tout devrait tous le faire de la même façon, en supposant qu'ils mettent en œuvre des opérations à virgule flottante IEEE, et je pense que la plupart (tous?) Faire.
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)
devrait également quelques informations au sondage en float.h.
D'après ce que 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 longtemps pour obtenir une taille.