myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Rund um die Programmierung » float, double Arithmetik: Epsilon berechnen
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

float, double Arithmetik: Epsilon berechnen

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
myCSharp.de
Moderationshinweis von herbivore (21.04.2011 18:16):

Dies ist ein Thread, auf den aus der FAQ verwiesen wird. Bitte keine weitere Diskussion, sondern nur wichtige Ergänzungen und diese bitte knapp und präzise. Vielen Dank!
 
Siassei Siassei ist männlich
myCSharp.de-Mitglied

Dabei seit: 15.02.2008
Beiträge: 401


Siassei ist offline

float, double Arithmetik: Epsilon berechnen

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

ich muss in einem Anwendungsfall den relativen max. Fehler abschätzen.
Es werden endlich viele Grundrechenoperationen +, - , *, /, ^, .... durchgeführt. Nun soll die Stelle ermittelt werden, die im Worst-Case noch korrekt ist. Leider habe ich kein Informatik-Mathe bekommen und kann im Web keine Informationen finden.

Kann mir jemand helfen, den Fehler abzuschätzen? Ich brauche das für meine kleine Mathe-Lib :-)
Achja, double muss nicht 64bit groß sein. Im Hintergrund durchaus 80bit oder mehr.  Quelle 1

Im  Forum stieß ich auf folgendes:

C#-Code:
public static double Epsilon()
        {
            double tau = 1.0;
            double alt = 1.0;
            double neu = 0.0;

            while (neu != alt)
            {
                tau *= 0.5;
                neu = alt + tau;
            }

            return 2.0 * tau;
        }

Gilt das nur für C#, oder allgemein? Somit auch für C++ native.

Gruß,
Thomas
18.10.2009 12:02 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
gfoidl gfoidl ist männlich
myCSharp.de-Team

avatar-2894.jpg


Dabei seit: 07.06.2009
Beiträge: 6.656
Entwicklungsumgebung: VS 2019
Herkunft: Waidring


gfoidl ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

Zitat:
Achja, double muss nicht 64bit groß sein.

Wenn die Programmiersprache IEEE 754 konform dann ist ein double 64bit - nicht mehr und nicht weniger.

Zitat:
Gilt das nur für C#, oder allgemein? Somit auch für C++ native.

Das ist allgemein gültig - also sprachinvariant.


mfG Gü
18.10.2009 12:11 Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.478
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Siassei,

Zitat:
Es werden endlich viele Grundrechenoperationen +, - , *, /, ^, .... durchgeführt.

es gibt kein festes Epsilon, das man unabhängig von der Berechnung verwenden kann. Der Fehler einer beliebigen Berechnung kann grundsätzlich beliebig groß werden. Eine Zahl minus eine fast gleichgroße Zahl mal eine sehr große Zahl führt typischerweise auch zu einem großen Fehler. Es ist also nicht mal gesagt, dass Epsilon immer kleiner eins ist.

Es gibt aber mathematische Regeln, mit denen man den (maximalen) Fehler abschätzen kann ==> Fehlerabschätzung.

herbivore
18.10.2009 12:21 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Siassei Siassei ist männlich
myCSharp.de-Mitglied

Dabei seit: 15.02.2008
Beiträge: 401

Themenstarter Thema begonnen von Siassei

Siassei ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Danke für eure Antwort :-)

@herbivore Eine manuelle Fehlerabschätzung ist natürlich möglich. Aber da wird mir der Compiler einen Strich durch die Rechnung machen. Unterschiedliche Optimierungen + Hersteller (.NET, Mono, was weiß ich) machen das so gut wie unmöglich.

Zitat:
Wenn die Programmiersprache IEEE 754 konform dann ist ein double 64bit - nicht mehr und nicht weniger.

Da habe ich mich wohl falsch ausgedrückt. Nach aussen gilt dies für die meisten Sprachen. Im Hintergrund wird oftmals mit höherer Auflösung gerechnet, sofern ein Chip die nötigen Befehle besitzt.

Ich kenne nur Java in Version 1.1, wo dieses Verhalten nicht implementiert ist. Ab Version 1.2 gibt es ein Schlüsselwort, aber das kennt so gut wie keiner.
C# .NET rechnet mit einer höheren Auflösung als 64bit im Hintergrund. Ansonsten wäre das  Beispiel nicht möglich.

Zitat:
Epsilon von mir ist 2,22044604925031E-16
Epsilon eigebatu ist 4,94065645841247E-324

Edit: Hier wird auf die kleinste, darstellbare Zahl (von Double) runter gerechnet. Das kann nicht gut sein. Komischerweiße wird das hier im Forum empfohlen. Oder ist das ein Fall für Copy&Paste?

C++ gibt bei mir zwei identische Werte aus. (GCC 4.4.1 - Linux)

Code:
1:
2:
2.22045e-16 // Berechnet
2.22045e-16 // numeric_limits<double>::epsilon()

Code:
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:
#include <iostream>
#include <limits>

using namespace std;

static double
Epsilon( )
{
    double tau = 1.0;
    double alt = 1.0;
    double neu = 0.0;

    while (neu != alt)
    {
        tau *= 0.5;
        neu = alt + tau;
    }

    return 2.0 * tau;
}


int
main(int len, char** args)
{
    cout << Epsilon( ) << endl;
    cout << numeric_limits<double>::epsilon( ) << endl;

    return 0;
}

Edit: Falschen Link

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Siassei am 18.10.2009 13:10.

18.10.2009 12:55 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
gfoidl gfoidl ist männlich
myCSharp.de-Team

avatar-2894.jpg


Dabei seit: 07.06.2009
Beiträge: 6.656
Entwicklungsumgebung: VS 2019
Herkunft: Waidring


gfoidl ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von Siassei:
Zitat:
Epsilon von mir ist 2,22044604925031E-16
Epsilon eigebatu ist 4,94065645841247E-324

Edit: Hier wird auf die kleinste, darstellbare Zahl (von Double) runter gerechnet. Das kann nicht gut sein. Komischerweiße wird das hier im Forum empfohlen. Oder ist das ein Fall für Copy&Paste?

Im Original wo das vorkommt (ist von mir) steht da noch mehr ;) Nämlich dass die Epsilon-Konstante der eingebauten Fließkommadatentypen bei .net nicht dem in der Numerik gebräuchlichen Epsilon (1+eps=1) entspricht sondern der kleinsten darstellbaren Fließkommazahl.
Somit ist das Zitat inkomplett.


mfG Gü
18.10.2009 13:06 Beiträge des Benutzers | zu Buddylist hinzufügen
JAck30lena JAck30lena ist männlich
myCSharp.de-Team

avatar-2653.jpg


Dabei seit: 01.10.2006
Beiträge: 11.397
Entwicklungsumgebung: Visual Studio 05/08/10 Prof.


JAck30lena ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat:
C# .NET rechnet mit einer höheren Auflösung als 64bit im Hintergrund.

noe.

intel haut seine floats&doubles in den FPU, welcher mit 90 bit rechnet. das würde er aber auch in c, c++ oder java machen. amd hanhabt das ein klein wenig anders, was aber ebenfalls irrelevant sein sollte. du kannst nciht für alle möglichen arten von cpu´s eine außnahme programmieren, da du so nicht zukunftssicher programmieren kannst. gehe einfach vom worst case aus und das sind 64 bit für double, denn diese sind wenigstens garantiert.
18.10.2009 13:54 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 10 Jahre.
Der letzte Beitrag ist älter als 10 Jahre.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 08.08.2020 02:27