Ich möchte überprüfen, ob eine IEEE754 32-Bit-Nummer den Wert von genau 0.0f hat (es wird gelegentlich darauf festgelegt.) Akkumulationsfehler werden Null sein, da die Daten häufig aktualisiert werden von einem Sensor. Mein Prozessor hat keine Hardware-FPU, daher werden die Operationen in einer relativ schnellen Software-Bibliothek ausgeführt. Es gibt jedoch immer noch Hunderte von Zyklen für Dinge wie Addieren, Subtrahieren und Vergleichen.Vergleichen Sie eine Fließkommazahl mit Null
Also habe ich mich gefragt, warum mein Compiler dies tut:
240: if(p_viewer->roll != 0.0f)
03FBC B81160 mul.uu w2,#0,w2
03FBE 900A2E mov.w [w14+20],w4
03FC0 900064 mov.w [w4+12],w0
03FC2 9000F4 mov.w [w4+14],w1
03FC4 07E91F rcall __nesf2
03FC6 E00000 cp0.w w0
03FC8 320054 bra z, 0x004072
__nesf2 vergleicht scheinbar zwei Gleitkommazahlen. Warum vergleicht man nicht einfach einen Vergleich mit 0.0f in ganzzahliger Form, also 0x00000000? Gibt es einen Grund, warum es das nicht tut oder ist es nur eine verpasste Optimierungsmöglichkeit?
Mein Compiler ist MPLAB C30, eine Version von GCC v3.23.
Ich habe mich gefragt, warum die Compiler dies nicht getan, wäre es wahrscheinlich nur 10 Zyklen maximal sein, während der __nesf2 Funktion dauert etwa 100 Zyklen. –
Ohne das Signalisierungs-NaN-Problem ist dies nur eine verpasste Optimierung. Füge einen Fehler ein. –
Und unter Berücksichtigung des Alters des Compilers (gcc 3.2.3?) Ist es wahrscheinlich, dass (a) es viele verpasste Optimierungen gibt, und (b) niemand daran interessiert ist, es zu beheben. –