Unit Testing: Wie falsch darf es heute sein? (float, double, ...)


  • Mod

    Sone schrieb:

    SeppJ schrieb:

    Sone schrieb:

    Welchen Epsilon du nimmst, ist halt abhängig davon wie genau du es brauchst.

    Kennst du Dieter Nuhr?

    otze schrieb:

    welches epsilon richtig ist, hängt von deinem Problem ab.

    Wollt ihr mich hier verarschen oder was? 😃

    Dann sag mal, welches epsilon ich bei einer Genauigkeit von 10^(-5) (d.h. 5 Stellen sollen im Rahmen der Rundung übereinstimmen) brauche.



  • Sone schrieb:

    Wollt ihr mich hier verarschen oder was? 😃

    double a=1;
    double f=0.1;
    double b = 10*f;
    
    //beides sollte ohne Rundungsfehler "0" ausgeben.
    std::cout<<(a-b);
    std::cout<<(1.e+50*a-1.e+50*b);
    
    //anderer Fall: die argumente sind alle ein Vielfaches kleiner als dein 1.e-7;
    std::cout<<(1.e-50*a-1.e-50*b);
    //also machen wir mal einen Fehler rein:
    std::cout<<(1.e-50*a-3.e-50*b);
    //-> völlig undetektierbar für dein epsilon
    


  • otze schrieb:

    Sone schrieb:

    Wollt ihr mich hier verarschen oder was? 😃

    double a=1;
    double f=0.1;
    double b = 10*f;
    
    //beides sollte ohne Rundungsfehler "0" ausgeben.
    std::cout<<(a-b);
    std::cout<<(1.e+50*a-1.e+50*b);
    
    //anderer Fall: die argumente sind alle ein Vielfaches kleiner als dein 1.e-7;
    std::cout<<(1.e-50*a-1.e-50*b);
    //also machen wir mal einen Fehler rein:
    std::cout<<(1.e-50*a-3.e-50*b);
    //-> völlig undetektierbar für dein epsilon
    

    ??
    Mein Epsilon? Ich hab gar nicht 10e-7 vorgeschlagen. Ich hab nur gesagt, falls er magic constants vermeiden will soll er ne Konstante definieren... o.O



  • SeppJ schrieb:

    Sone schrieb:

    SeppJ schrieb:

    Sone schrieb:

    Welchen Epsilon du nimmst, ist halt abhängig davon wie genau du es brauchst.

    Kennst du Dieter Nuhr?

    otze schrieb:

    welches epsilon richtig ist, hängt von deinem Problem ab.

    Wollt ihr mich hier verarschen oder was? 😃

    Dann sag mal, welches epsilon ich bei einer Genauigkeit von 10^(-5) (d.h. 5 Stellen sollen im Rahmen der Rundung übereinstimmen) brauche.

    Man nimmt einfach einen festen Epsilon von 1e-5 (also 10-5):

    #include <iostream>
    #include <complex>
    
    int main()
    {
            float a = 0.123454;
            float b = 0.123458;
    
            std::cout << (std::abs(a - b) < 1e-5) << '\n';
    }
    


  • Kann man diesen Sone mal sperren? Der schreibt immer sonen Mist und spammt damit jeden Thread voll.



  • callforban schrieb:

    Kann man diesen Sone mal sperren? Der schreibt immer sonen Mist und spammt damit jeden Thread voll.

    Made my Day 😃



  • Cyres schrieb:

    callforban schrieb:

    Kann man diesen Sone mal sperren? Der schreibt immer sonen Mist und spammt damit jeden Thread voll.

    Made my Day 😃

    Der ist alt...


  • Mod

    Sone schrieb:

    Man nimmt einfach einen festen Epsilon von 1e-5 (also 10-5):

    *Seufz*

    Da fällst wohl auf alles rein? Glaubst du, ich hätte die Frage gestellt, wenn die Antwort so einfach wäre? Und du bringst trotzdem stolz die naivstmögliche Antwort, sogar nachdem otze und ich schon insgesamt 3x erklärt und verlinkt haben, wieso das falsch ist.



  • Sone schrieb:

    Man nimmt einfach einen festen Epsilon von 1e-5 (also 10-5):

    kleiner Tipp: wenn wir von Werten von a und b reden, die um die 1.e+50 liegen, dann kann float die Abweichung "1.e-5" gar nicht mehr darstellen. Das gilt dann natürlich auch in den Differenzen, das heißt, a-b > 1.e-5 ist immer wahr, wenn a!=b.



  • /rant/ schrieb:

    Hallo,

    Ich habe folgende Frage, welche beim systematischen Unit Testing plötzlich relevant geworden ist: Wenn ich Gleitkommazahlen auf Gleichheit testen will, gibt es spezielle Funktionen, welche dies mit einer Angabe Epsilon für die erlaubte Abweichung tun. Was für einen Wert soll man aber für Epsilon nehmen? Gibt es irgend eine gute Konstante hierfür? epsilon von numeric_limits ist wohl nicht gut?

    Ich programmiere nicht für die Raumfahrt und wende Operationen nicht 10'000-fach an, aber irgendwie widerstrebt es mir, einfach überall diese Magic Numbers à la 10e-7 zu schreiben 😉

    Setz Dein Epsilon so klein wie Möglich.
    Steig ruhig mal mit e-50 ins rennen und guck, was passiert.
    Kannst Du das Epsilon halten, ist doch alles super. Wenn nicht, musst Du überlegen, ob die größere Unschärfe bei Gleichheit noch zu sicheren Ergebnissen führt.

    Dein Epsilon ist abhängig von den Daten, die verarbeitest und natürlich ihrem Maßstab. Möchtest Du Millimetergenau arbeiten, ist das Epsilon abhängig von der Frage, ob Du in Metern, Zentimetern oder Millimetern misst.

    Weiterhin empfehle ich Dir, das Epsilon bedarfsgerecht festzulegen. So brauchst du für die Übereinstimmung von Strecken (z.B. 3D-Punkte) eventuell ein anderes Epsilon als für die Übereinstimmung von Winkeln.

    Ich benutze dafür eine Klasse Double, die Vergleiche automatisch regelt. Nimm ein Template, leite die Datentypen ab und gib jedem Datentyp ein entsprechendes Epsilon mit.

    Keine Raumfahrt... nur CAD.


Anmelden zum Antworten