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# Komplett

Sie kennen sich in objektorientierter Programmierung aus. Sie schreiben C++ oder Java? Und nun stehen Sie vor der Aufgabe, in C# Anwendungen zu erstellen. Das C# Komplett-Seminar verschafft Ihnen umfassende Programmierkenntnisse in dieser Sprache. Nach der Schulung entwickeln Sie selbständig Anwendungen mit C#. Sie kennen die Datentypen und Klassenbibliotheken der objektorientierten Programmiersprache C#. Der Komplettkurs setzt bei den Grundlagen von C# ein. Sie arbeiten mit Variablen und konvertieren Typen. Multithreading, Delegates, Generics sind nach dem Seminar für Sie kein Geheimnis mehr.

VB.NET Aufbau

Sie verfügen nach der Schulung über fundierte Kenntnisse in der Arbeit mit objektorientierten Modellen in VB.NET und können wiederverwendbare Komponenten eigenständig erzeugen.

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!