Zwei häufig zu berücksichtigende Fälle:
Ganzzahlige Arithmetik
Wenn Sie eine Ganzzahl-Arithmetik verwenden (die abschneidet), erhalten Sie offensichtlich ein anderes Ergebnis. Hier ist ein kleines Beispiel in C #:
public static void TestIntegerArithmetic()
{
int newValue = 101;
int oldValue = 10;
int SOME_CONSTANT = 10;
if(newValue / oldValue > SOME_CONSTANT)
{
Console.WriteLine("First comparison says it's bigger.");
}
else
{
Console.WriteLine("First comparison says it's not bigger.");
}
if(newValue > oldValue * SOME_CONSTANT)
{
Console.WriteLine("Second comparison says it's bigger.");
}
else
{
Console.WriteLine("Second comparison says it's not bigger.");
}
}
Ausgabe:
First comparison says it's not bigger.
Second comparison says it's bigger.
Gleitkomma-Arithmetik
Abgesehen von der Tatsache, dass eine Division ein anderes Ergebnis liefern kann, wenn sie durch Null dividiert (sie erzeugt eine Ausnahme, während eine Multiplikation dies nicht tut), kann sie auch zu leicht unterschiedlichen Rundungsfehlern und einem anderen Ergebnis führen. Einfaches Beispiel in C #:
public static void TestFloatingPoint()
{
double newValue = 1;
double oldValue = 3;
double SOME_CONSTANT = 0.33333333333333335;
if(newValue / oldValue >= SOME_CONSTANT)
{
Console.WriteLine("First comparison says it's bigger.");
}
else
{
Console.WriteLine("First comparison says it's not bigger.");
}
if(newValue >= oldValue * SOME_CONSTANT)
{
Console.WriteLine("Second comparison says it's bigger.");
}
else
{
Console.WriteLine("Second comparison says it's not bigger.");
}
}
Ausgabe:
First comparison says it's not bigger.
Second comparison says it's bigger.
Falls du mir nicht glaubst, hier ist eine Geige, die du ausführen und selbst sehen kannst.
Andere Sprachen können abweichen. Bedenken Sie jedoch, dass C # wie viele andere Sprachen eine Gleitkommabibliothek nach IEEE-Standard (IEEE 754) implementiert , sodass Sie bei anderen standardisierten Laufzeiten dieselben Ergebnisse erzielen sollten.
Fazit
Wenn Sie auf der grünen Wiese arbeiten , sind Sie wahrscheinlich in Ordnung.
Wenn Sie an altem Code arbeiten und es sich bei der Anwendung um eine finanzielle oder andere vertrauliche Anwendung handelt, die arithmetisch arbeitet und konsistente Ergebnisse liefern muss, gehen Sie beim Ändern von Vorgängen sehr vorsichtig vor. Wenn Sie müssen, stellen Sie sicher, dass Sie Komponententests haben, die subtile Änderungen in der Arithmetik erkennen.
Wenn Sie nur Dinge wie das Zählen von Elementen in einem Array oder andere allgemeine Berechnungsfunktionen ausführen, sind Sie wahrscheinlich in Ordnung. Ich bin nicht sicher, ob die Multiplikationsmethode Ihren Code klarer macht.
Wenn Sie einen Algorithmus für eine Spezifikation implementieren, würde ich nichts ändern, nicht nur wegen des Problems der Rundungsfehler, sondern damit Entwickler den Code überprüfen und jeden Ausdruck der Spezifikation zuordnen können, um sicherzustellen, dass keine Implementierung vorliegt Mängel.
oldValue >= 0
?