Écarts en virgule flottante dus à l'optimisation : bug du compilateur ou précision intrinsèque
Le code fourni, destiné à arrondir les valeurs à virgule flottante, présente des valeurs divergentes comportement sur différents compilateurs et paramètres d’optimisation. Cet écart provient de divergences dans la gestion de la précision en virgule flottante lors de l'optimisation.
Les processeurs Intel x86 utilisent une précision étendue de 80 bits en interne, tandis que le double est généralement un type de données de 64 bits. Les niveaux d'optimisation influencent la fréquence à laquelle les valeurs à virgule flottante sont stockées en mémoire, ce qui conduit à un arrondi de précision de 80 bits à 64 bits.
Pour atténuer cela, l'option -ffloat-store gcc peut être utilisée pour maintenir résultats à virgule flottante cohérents à travers les niveaux d’optimisation. Alternativement, l'utilisation du type long double, qui a généralement une largeur de 80 bits sur gcc, peut éviter les problèmes d'arrondi entre une précision de 80 bits et 64 bits.
Selon la documentation man gcc, le -ffloat-store option :
Do not store floating point variables in registers, and inhibit other options that might change whether a floating point value is taken from a register or memory.
Cette option est souvent utile dans les scénarios où les programmes nécessitent une définition précise de la virgule flottante IEEE et s'appuient sur des calculs intermédiaires stockés dans des variables.
Dans les versions x86_64, les compilateurs utilisent par défaut SSE s'enregistre pour float et double, éliminant ainsi l'utilisation d'une précision étendue et atténuant le problème en question. L'option -mfpmath du compilateur gcc contrôle ce comportement.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!