Feedback

C# - Maschinengenauigkeit

Veröffentlicht von am 25.09.2008
(5 Bewertungen)
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.
GFU-Schulungen  [Anzeige]

C# Aufbaukurs

Sie haben grundlegende .NET- und C#-Kenntnisse und und wollen diese nun erweitern. Der Aufbaukurs C# führt Sie ein die Arbeit mit Interfaces und Delegates, Generics und Parallel Computing.

Visual Studio Team Foundation Server 2017/2015 (TFS) für Projektmitglieder - Kompakt

Nach Teilnahme an dieser Schulung sind Ihnen die Grundlagen von ALM geläufig. Sie planen und steuern Projekte effizient mit dem Visual Studio Team Foundation Server.

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;
		}
	}
}
Abgelegt unter Numerik, Genauigkeit, Epsilon, Mathe.

3 Kommentare zum Snippet

Rainer Hilmer schrieb am 25.09.2008:
Interessant, das kommt in meine Sammlung! :)
Rainer Hilmer schrieb am 25.09.2008:
Ich muß mich korrigieren. Bei Epsilon hatte doch etwas in meinem Kopf geklingelt. Schau mal hier:
http://msdn.microsoft.com/de-de/library/system.double.epsilon.aspx
Alle Gleitkommazahlentypen haben Epsilon schon als Konstante im Gepäck.
Günther Foidl schrieb am 25.09.2008:
Ich weiß dass all Gleitkommatypen ein Epsilon eingebaut haben. Dieses entspricht aber nicht der allgemeine numerischen Definition. Da hat sich Microsoft wohl vertan. Vergleich mal die beiden Werte.
Epsilon von mir ist 2,22044604925031E-16
Epsilon eigebatu ist 4,94065645841247E-324

Kann also in deiner Sammlung bleiben
 

Logge dich ein, um hier zu kommentieren!