Einige Untersuchungen im Assemblercode. (OllyDbg)
%Vor%
Der zugehörige Assembly-Abschnitt:
%Vor%
Der generierte Code für zwei Aufrufe ist der gleiche, aber die Ausgaben sind unterschiedlich. Ich weiß nicht, warum tcc FLDCW
dorthin gestellt hat. Aber der Hauptgrund für zwei verschiedene Werte ist diese Zeile.
Vor dieser Zeile ist die Runde Mantissa Precision Control Bits 53bit (10), aber nach Ausführung dieser Zeile (sie lädt die FPU-Registersteuerung) wird sie auf 64Bits (11) gesetzt. Auf der anderen Seite Rundungskontrolle ist nächste so 99.999999999999999990 ist das Ergebnis. Lesen Sie mehr ...
Lösung:
Nachdem Sie (int)
zum Umwandeln von float
in int
verwendet haben, sollten Sie diesen numerischen Fehler erwarten, da bei diesem Casting die Werte zwischen [0, 1) und 0 abgeschnitten werden.
Angenommen, die 10 2 ist 99,99999999999. Nach diesem Cast ist das Ergebnis 99.
Versuchen Sie, das Ergebnis zu runden, bevor Sie es in eine Ganzzahl umwandeln, zum Beispiel:
%Vor%