On m'a dit que la plupart des ordinateurs modernes suivent la même norme à virgule flottante, cela signifie-t-il qu'ils obtiendront tous la même réponse flottante pour une opération mathématique donnée si les entrées sont les mêmes?
Je demande parce que je fais des recherches sur la création d'un jeu RTS sur un réseau et que la synchronisation de centaines de positions d'unité semble être une mauvaise façon de procéder.
Donc, si j'envoie uniquement des entrées, je dois garantir que tous les clients obtiennent le même résultat en les faisant exécuter la simulation à partir de ces entrées.
J'ai lu que les anciens jeux RTS utilisaient l'arithmétique à virgule fixe, mais je ne sais pas si cela est toujours requis sur les ordinateurs modernes s'ils adhèrent tous à la même norme? On m'a également dit que bien qu'imprécis, le résultat de la virgule flottante est déterministe pour la même entrée (ce qui, je suppose, signifie que tout ordinateur suivant la même norme obtient le même résultat imprécis?).
Les ordinateurs ont-ils encore des écarts même s'ils suivent la même norme de point flottant?
J'écris ce jeu en C #, je ne sais pas si cela importe, pensais que je le mentionnerais de toute façon.
la source
Réponses:
Malheureusement, oui, surtout lorsque vous utilisez C # (ou un autre langage compilé JIT). Le problème qui se produit ici est que l'étape de compilation JIT sur certaines architectures de processeur produit du code qui utilise plus de registres CPU que sur d'autres architectures. Cela peut conduire à des situations où sur certaines machines, une précision en virgule flottante étendue est utilisée pour certaines opérations, tandis que sur d'autres machines non. Cela signifie que pour chaque calcul itératif utilisant des doubles, il est possible de produire différentes erreurs d'arrondi cumulées.
Ce n'est pas un problème hypothétique, j'ai une expérience de première main avec de telles déviations dans les logiciels de simulation d'ingénierie contemporaine, sur du matériel plus ou moins moderne. Ce problème rend très difficile la création de tests de régression fiables pour des calculs complexes en virgule flottante qui produisent exactement le même résultat sur toutes les machines impliquées.
la source
FLT_EVAL_METHOD
en ISO C / C ++. Fonctions transcendantes (par exemplesin
,exp
,log
) ne sont pas réglementés à la fois par les normes linguistiques standard et la programmation à virgule flottante IEEE. Une simple mise à niveau de la version de la bibliothèque (par exemple une nouvelleglibc
version) peut entraîner des résultats différents.Erreurs en virgule flottante
Chaque nombre à virgule flottante accumule l'imprécision lorsqu'il est utilisé pour le calcul. Il s'agit d'un simple fait d'utiliser un format imprécis pour calculer. Les calculs sont également sensibles à l'ordre de calcul, la commutativité n'est pas garantie, c'est-à-dire:
(a + b) + c
peut ou peut ne pas être identique àa + (b + c)
.De plus, les processeurs n'ont pas nécessairement la même longueur de mantisse que le standard de mémoire. Cela peut générer un comportement intéressant car le flotteur 32/64/128 bits fonctionne parfois comme s'il avait plus de bits.
Erreurs à virgule fixe
Cela étant dit, l'arithmétique à virgule fixe peut également accumuler des erreurs. La différence est que les nombres à virgule fixe indiquent clairement quelle précision est perdue et, en fonction des opérations choisies, peuvent éviter complètement les erreurs d'arrondi. Ils sont également commutatifs
(a + b) + c = a + (b + c)
.Lequel?
Laquelle utiliser dépend entièrement des propriétés dont vous avez besoin.
Nombres à virgule flottante:
Numéros de points fixes:
la source
(a + b * c) / d - e
. À l'exception de problèmes évidents tels que laNaN
division par zéro ou le dépassement / dépassement, il est possible que cette expression soit incorrecte. Ajoutez à cela l'impédance entre la mémoire et le registre en termes de précision et même un simple chargement / stockage à partir de la mémoire de la "même" valeur à virgule flottante changera la réponse.Il y a la question de savoir pourquoi vous voudriez garantir des résultats identiques, car des résultats identiques ne donnent aucune garantie que vos résultats sont utiles .
Vous pourriez avoir un algorithme numériquement instable qui donne deux résultats identiques mais complètement absurdes sur différents ordinateurs. S'il y a des différences, mais que les résultats sont les mêmes à 13 chiffres, c'est beaucoup plus fiable.
Il y a très peu de situations où la reproductibilité est vraiment importante: dans un moteur de mise en page, ou compression / décompression sans perte. L'utilisation d'un point fixe risque fort d'être erronée.
la source