Ungültige Gleitkommaoperation



  • Hallo,

    ich bekomme bei folgender Funktion die Fehlermeldung "Ungültige Gleitkommaoperation".

    void __fastcall TForm1::XYZToLab(XYZColor *pixel, LabColor *farbe, XYZColor ref)
    {
            double bearb[3];
    
            // Durchlaufen des Bitmapbereichs in Zeilen und Spalten
            for (int g = 0; g < 307200; g++)
            {
    
       ----->       bearb[0]=pow((pixel[g].X/ref.X) , 0.33333333);
                    bearb[1]=pow((pixel[g].Y/ref.Y) , 0.33333333);
                    bearb[2]=pow((pixel[g].Z/ref.Z) , 0.33333333);
    
                    farbe[g].L=116*bearb[1]-16;
                    farbe[g].a=500*(bearb[0]-bearb[1]);
                    farbe[g].b=200*(bearb[0]-bearb[2]);
            }
    }
    

    XYZColor und LabColor sind Strukturen mit je drei double-Werten.

    pixel und farbe sind Felder mit 307200 Einträgen, die mit new erstellt wurden.

    Das Programm soll die 3. Wurzel von den drei Farbwerten eines Pixels (z. B. pixel[g].X) durch eine zugehörige Vergleichsfarbe ziehen.

    Der Fehler tritt in dem Block auf, bei welchem ich den Pfeil gemacht habe.

    Weis echt nichtmehr, wo der Fehler liegen kann 😕



  • guck dir mal an, was in ref und pixel für Werte stehen (Division durch 0 macht sich nicht besonders gut, genauso wie die Wurzel aus einem negativen Wert).



  • Hab ich grad durchprobiert. Ich habe keine Zahl kleiner als 0. Bei *pixel sind manche genau 0, aber das sollte doch kein Problem sein, oder?



  • *pixel sind manche genau 0, aber das sollte doch kein Problem sein, oder?

    a) hat keiner etwas von "kleiner als Null" gesagt

    b) was ist noch aus dem Matheunterricht bezüglich der 0 und einer Division bekannt?



  • Welche BCB-Version wird denn benutzt?
    Beim BCB 6 kommt auf jeden Fall eine 'Gleikommadivision durch Null'-Felermeldung. Und wenn der Fehler beim pow auftritt, hätte ich eher mit einem Bereichsfehler gerechnet...



  • Ja das iss schon klar. Ein bisschen weiß ich nun auch noch.

    1. *pixel ist nie ein Teiler! Es wird nur durch etwas geteilt. 0/x ist mathematisch durchaus erlaubt.

    2. Außerdem habe ich alle Werte, die genau 0 sind auf 1 erhöht, falls C++ etwas gegen allgemein gültige Mathematikregeln hat. Der Fehler tritt jedoch weiterhin auf.

    Somit sind wir wieder am Anfang. 😉



  • Welche Werte haben denn pixel[g].X und ref.X wenn der Fehler auftritt?



  • Habs gefunden. Gab Probleme beim Übergeben der Felder.

    Jetzt läufts 🙂


Anmelden zum Antworten