Heim >Backend-Entwicklung >C++ >Warum kommt es bei der Optimierung zu Abweichungen bei der Gleitkomma-Rundung?

Warum kommt es bei der Optimierung zu Abweichungen bei der Gleitkomma-Rundung?

Linda Hamilton
Linda HamiltonOriginal
2024-11-12 21:51:01444Durchsuche

Why Do Floating-Point Rounding Discrepancies Occur During Optimization?

Gleitkomma-Diskrepanzen aufgrund der Optimierung: Compiler-Fehler oder intrinsische Präzision

Der bereitgestellte Code, der Gleitkommawerte runden soll, weist Abweichungen auf Verhalten auf verschiedenen Compilern und Optimierungseinstellungen. Diese Diskrepanz ist auf Diskrepanzen bei der Handhabung der Gleitkomma-Präzision während der Optimierung zurückzuführen.

Intel x86-Prozessoren verwenden intern eine erweiterte 80-Bit-Präzision, während Double typischerweise ein 64-Bit-Datentyp ist. Optimierungsstufen beeinflussen, wie häufig Gleitkommawerte im Speicher gespeichert werden, was zu einer Rundung von 80-Bit- auf 64-Bit-Präzision führt.

Um dies zu mildern, kann die gcc-Option -ffloat-store zur Beibehaltung verwendet werden Konsistente Gleitkomma-Ergebnisse über alle Optimierungsstufen hinweg. Alternativ können durch die Verwendung des Long-Double-Typs, der bei gcc normalerweise 80 Bit breit ist, Rundungsprobleme zwischen 80-Bit- und 64-Bit-Genauigkeit vermieden werden.

Gemäß der Man-GCC-Dokumentation ist der -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.

Diese Option ist häufig in Szenarien nützlich, in denen Programme eine genaue Definition von IEEE-Gleitkommazahlen erfordern und auf in gespeicherten Zwischenberechnungen angewiesen sind Variablen.

In x86_64-Builds verwenden Compiler standardmäßig SSE-Register für Float und Double, wodurch die Verwendung erweiterter Genauigkeit entfällt und das betreffende Problem entschärft wird. Die gcc-Compileroption -mfpmath steuert dieses Verhalten.

Das obige ist der detaillierte Inhalt vonWarum kommt es bei der Optimierung zu Abweichungen bei der Gleitkomma-Rundung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn