Meine beste Wette ist, dass dies auf die Freiheit zurückzuführen ist, die Laufzeit mit einer höheren Genauigkeit Gleitkomma-Operationen auszuführen hat, als die Typen beteiligt und dann das Ergebnis Kürzen zu die Genauigkeit des Typs bei der Zuweisung:
Die CLI-Spezifikation in Abschnitt 12.1.3 schreibt eine genaue Genauigkeit für Gleitkommazahlen, float und double vor, wenn sie in Speicherpositionen verwendet werden. Es erlaubt jedoch, dass die Genauigkeit überschritten wird, wenn Fließkommazahlen an anderen Stellen wie der Ausführungsstapel, Argumente, Rückgabewerte usw. verwendet werden. Welche Genauigkeit verwendet wird, bleibt der Laufzeit und der zugrunde liegenden Hardware überlassen. Diese zusätzliche Genauigkeit kann zu feinen Unterschieden bei Gleitkommaauswertungen zwischen verschiedenen Maschinen oder Laufzeiten führen.
Quelle here.
In Sie erstes Beispiel t % (1f/stepAmount)
können mit einer höheren Genauigkeit als float
und dann abgestumpften vollständig durchgeführt werden, wenn das Ergebnis zu remainder
, während im zweiten Beispiel zugeordnet ist, zu 1f/stepAmount
fractions
zur Modulo-Operation vor und abgestumpften zugeordnet ist.
Wie, warum stepamount
macht ein const
macht beide Modul Operationen konsistent ist der Grund dafür, dass 1f/stepamount
sofort einen konstanten Ausdruck wird, die ausgewertet und abgeschnitten Präzision zu schweben bei Kompilierung und unterscheidet sich nicht von 0.01f
Schreiben, die im Wesentlichen macht beide Beispiele sind gleichwertig.
Für was es wert ist, kann ich dies nicht auf VS für Mac v7.2 (636) reproduzieren. Beide Reste sind '0.0' – InBetween
Dotnetfiddle zeigt 0 für beide Ergebnisse: https://dotnetfiddle.net/XTHswt Ich habe genau den gleichen Code wie in der Dotnetfiddle-Link mit https://www.jdoodle.com/compile-c versucht -sharp-online und es zeigt das Problem, das Sie beschreiben. – TyCobb
Reproduzierbar hier: https://ideone.com/JHomEl – Ryan