Aloha :)
Willkommen in der Stacklounge... \o/
Beim Vergleich von Fließkommazahlen auf Gleichheit ist stets Vorsicht geboten, da es durch Abschneiden der Binär-Mantisse und durch Normierungen der Binär-Mantisse zu Rundungsfehlern kommen kann.
In deinem Code ist dieser Effekt jedoch unwahrscheinlich, weil die Bitmuster bei beiden Berechnungen von \(\cos(x)\) identisch sein sollten.
Meine Vermutung ist Folgende:
Im IEEE754-Standard gibt es das Format "long double" mit intern 80 Bits. Intel- und AMD-Prozessoren rechnen per Default-Einstellung intern immer mit diesem Format, auch wenn die Fließkomma-Werte im Format "double" oder "float" vorliegen. Beim Speichern eines Wertes vom Fließkomma-Stack der CPU ins RAM werden die "long double"-Werte dann in das jeweilige Format "double" oder "float" runtergerechnet.
Beim Vergleich \(f==\cos(x)\) liegen auf dem Fließkomma-Stack des Prozessors 2 Werte:
Der Wert für \(f\) stammt aus dem Speicher, lag also im "double"-Format vor und wurde auf dem Fließkomma-Stack in das "long double"-Format konvertiert, wobei die Mantisse mit Nullbits aufgefüllt wird.
Der gerade berechnete Wert für \(\cos(x)\) liegt ebenfalls im "long double"-Format vor, allerdings sind hier alle Stellen der "long double"-Mantisse frisch berechnet und gültig, sodass sich die Mantissen in den zuvor aufgefüllten Nullbits unterscheiden.
Du kannst die Vermutung prüfen, indem du den Vergleich leicht abänderst:
if (f==(double)cos(x)) ...
Ein kleines Feeback, ob ich richtig liege, wäre schön.