2009-03-12 9 views

Antwort

1

Unabhängig von der Zuverlässigkeit, die Modulo-Methode sieht leicht zu verstehen (keine Notwendigkeit, eine Spezifikation zu lesen) und schnell (kein Funktionsaufruf).

1

Sie werden auf das klassische Problem der Gleitkommazahlen stoßen, die nur Annäherungen sind. Wenn Sie dies tun:

floatingPoint = 1.0/3.0; 
floatingPoint *= 3; 

Sie am Ende mit etwas wird in der Nähe, aber nicht genau, 1.

2

Schwimmdock Punkte können nicht einige Zahlen repräsentieren genau, so gibt es keine Methode, die wirklich ist zuverlässig. Insbesondere kann jede int, die größer als 2^24 ist, nicht exakt durch eine float dargestellt werden. Leider ist das ein Teil des Preises, den Sie für die Verwendung einer Gleitkommadarstellung zahlen!

Für eine ausgezeichnete Zusammenfassung der verschiedenen Probleme mit Fließkomma, die Sie beachten sollten, ermutige ich Sie, "What Every Computer Scientist Should Know About Floating-Point Arithmetic" zu überprüfen.

5

Sie sollten nicht auf exakte Gleichheit auf Null prüfen, da eine Fließkommazahl normalerweise nur die größtmögliche Annäherung an die von Ihnen zugewiesene Zahl enthält.

Zum Beispiel könnte der nächstmögliche Wert von 42, den der Typ darstellen könnte, etwa 42.0000000000000000662 sein, was Sie immer noch als Ganzzahl zählen möchten.

die Differenz zwischen dem Wert übernehmen und den gerundeten Wert, nehmen Sie dann den absoluten Wert, dass (so dass sie nicht negativ ist) und auf einen kleinen Wert vergleichen:

if (Math.Abs(Math.Round(floatingPoint) - floatingPoint) < 0.000001) ... 
+0

ganzen Zahlen genau dargestellt werden kann, in Fließkomma-Notation. Ihr Beispiel für 42.0000000000000000662 kann einfach nicht passieren. –

+0

Dies ist keine gute Idee. Schließlich wird der Unterschied zwischen aufeinanderfolgenden Fließkomma-Repräsentationen größer als 0,5 sein, und dann ist es nicht klar, welche Ganzzahl die Zahl darstellen soll. –

+0

@Jimmy: Das stimmt nicht. Versuchen Sie, 2^31-1 in einer Fließkomma-Implementierung mit einfacher Genauigkeit genau darzustellen. –

1

Es gibt keine allgemein zuverlässig Methode.

Da Gleitkommazahlen (meistens) immer eine Annäherung sind, wenn sie das Ergebnis früherer Berechnungen sind, gibt es keine einfache Ganzzahläquivalenz, wie andere gezeigt haben.

Sie haben Bereich und Präzision sowohl fp zu betrachten und int Werte, die Sie mit zu tun haben. Alles hängt davon ab, was Sie erreichen möchten.

Guffa hat einen guten Ansatz mit einem erlaubten Genauigkeitsbereich für den Vergleich.

0

Ganze Zahlen können in Gleitkommadarstellung dargestellt genau so irgendwelche von denen sollte funktionieren, wenn Sie für eine exakte ganze Zahl Überprüfung (ich persönlich würde das erste verwenden ...)