Für numerische Vergleiche von Gleitkommazahlen sollte == nicht verwendet werden. Aufgrund von der nur näherungsweisen Repräsentationen der Zahlen im Speicher ist es besser einen Vergleich mit der Maschinengenauigkeit Epsilon vorzunehmen.
D.h. statt
if (doubleWert1 == doubleWert2) sollte zur Prüfung auf Gleichheit
if (Math.Abs(doubleWert1 - doubleWert2) < epsilon)
verwendet werden.
In diesem Snippet wird gezeigt wie dieses Epsilon berechnet wird.
Wichtig: Ergänzende Informationen unter http://dotnet-forum.de/forums/p/1755/6292.aspx#6292.
using System;
namespace ConsoleApplication1
{
class Program
{
private static readonly double epsilon = Epsilon();
static void Main(string[] args)
{
Console.WriteLine(epsilon);
Console.ReadKey();
}
public static double Epsilon()
{
double tau = 1.0;
double walt = 1.0;
double wneu = 0.0;
while (wneu != walt)
{
tau *= 0.5;
wneu = walt + tau;
}
return 2.0 * tau;
}
}
}
3 Kommentare zum Snippet