Willkommen bei dotnet-snippets.de! Snippet hinzufügen Login Registrieren
Snippets in der Datenbank: 1563 | Anzahl registrierter User: 1895 | Besucher online: 173
Hauptmenü
Home
Top Ten
Zufälliger Snippet
FAQs
.NET Community
dotnet-forum.de
dotnet-kicks.de
Social

RSS Feeds
Rss Alle Snippets
Rss C#
Rss VB.NET
Rss C++
Rss ASP.NET
Partner
Member of Microsoft Community Leader/Insider Program (CLIP)

Maschinengenauigkeit


Autor: Günther Foidl
Sprache: C#
Bewertung:
8.76 (4 votes)
Anzahl der Aufrufe: 7725
  
Kick it on dotnet-kicks.de  

Beschreibung:

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.


Abgelegt unter: Numerik, Genauigkeit, Epsilon, Mathe.



C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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;
		}
	}
}
Sie haben Fragen zu diesem Snippet oder brauchen Hilfe bei der .NET Entwicklung?
Freundliche und kompetente Entwickler helfen Ihnen gern weiter im Forum für .NET Entwicklung.



Kommentare:
(Zum Schreiben von Kommentaren bitte anmelden.)

Rainer Hilmer schrieb am:  25.09.2008 00:23:49

Interessant, das kommt in meine Sammlung! :)
Rainer Hilmer schrieb am:  25.09.2008 00:32:00

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 09:28:42

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


Diese Snippets könnten für Sie interessant sein:
[C#] Summe 1..n berechnen
[C#] Fibonacci-Folge berechnen
[C#] n-te Fibonaccizahl rekursiv berechnen
[C#] Summe 1²...n² berechnen.
[C#] Summe 1³..n³ berechnen.
[C#] größten gemeinsamen Teiler berechnen.
[VB.NET] Multiplikation von übergroßen Zahlen
[C#] Dreiecksberechnung
[VB.NET] PI nach der Bailey-Borwein-Plouffe-Formel berechnen
[VB.NET] Quadratische Gleichung mit der PQ Formel lösen
[VB.NET] Basisrechenfunktionen für einen Kreis
[C++] Exponents
[C#] Quersummenberechnung
[C#] Geodaten in sexagesimal Format umrechnen
[VB.NET] Größten gemeinsamen Teiler berechnen
[VB.NET] Quadratwurzel ohne Sqrt() Funktion ziehen
[C#] Addiere alle ganzen Zahlen von x bis y
[C++] Caesar
[C#] "echte" Teiler Summe berechnen
[C#] Formelevaluierung aus RPN Form
[C#] Prüfung auf narzisstische Zahlen
[C#] CellMatrix
[C#] Flächenberechnungen am Kreis,Quadrat,Parallelogramm,Trapez
[C#] Bruch-Klasse
[VB.NET] einfacher rekursiver Mathe Parser
[VB.NET] Permutation nachweisen
[VB.NET] Das Sieb des Eratosthenes
[VB.NET] Primfaktorzerlegung
[VB.NET] Größter gemeinsamer Teiler
[VB.NET] Modulare Exponentation
[VB.NET] Fibonacci-Folge iterativ erzeugen
[VB.NET] Das Sieb von Atkin
[VB.NET] Das Sieb von Atkin (2)
[VB.NET] Werte zweier Variablen tauschen
[VB.NET] Ganzzahlige Wurzel
[VB.NET] Binäre Exponentation
[VB.NET] Größter gemeinsamer Teiler (2)
[VB.NET] Binomialkoeffizient
[VB.NET] Kleinster natürlicher Teiler > 1
[VB.NET] Das Sieb von Atkin (2) - aktuell
[VB.NET] Dezimalzahl in Zahl der Basis b < 37 konvertieren

schlecht sehr gut
1 2 3 4 5 6 7 8 9 10
Nur angemeldete User können Snippets bewerten.