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]

VB.NET 2017/2015/2013 Komplett

Ziel des Seminars ist der flexible Umgang mit VB.NET, wie z.B. die damit verbundene eigenständige Entwicklung von Programmen oder das Verwenden von Datenbanken.

ASP.NET Core - Der Einstieg

In nur 3 Tagen lernen Sie, wie man mit ASP.NET Core und den Technologien MVC, Entity Framework, WebAPI und Razor professionelle Web-Anwendungs-Architekturen aufbaut. Diese Schulung ist der perfekte Einstieg, um datengetriebene und präsentations-orientierte Applikationen auf Basis der ASP.NET Core Plattform zu erstellen.

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!