Float-Werte aus Matlab(MEX) und C vergleichen



  • Hallo,

    ich habe in Matlab ein Skript(MEX) geschrieben, das mir bestimmte float-Werte berechnet. Um diese Daten zu überprüfen, habe ich ein analoges C-Skript. Nun habe ich das Problem, dass die Werte zwar im Prinzip ident sind, aber die Nachkommastellen unterschiedlich lang sind.
    Nun, da ich in C und Matlab ein Anfänger bin und auch nicht viel technisches Backgroundwissen habe, bräuchte ich bitte einen Rat, Tipp wie ich diese Problem am sinnvollsten lösen könnte.

    In C bekomme ich mit Float 6 Nachkommastellen und in Matlab wesentlich mehr. Was mich aber misstrauisch macht ist, dass nur 6 Nachkommastellen dargestellt werden.

    Danke für jeden Tipp, Rat 🙂


  • Mod

    float ist in der Regel nur auf 6-7 Dezimalstellen genau, für mehr musst du größere Datentypen benutzen. Oder meinst du die Ausgabe? Dazu guck dir die Dokumentation von printf an:
    www.cplusplus.com/reference/cstdio/printf/
    Mit einem Punkt kannst du also die Genauigkeit der Ausgabe beeinflussen.



  • Bedenke auch, das C mindestens zwei Fließkommatypen kennt: float , double und später long double .

    Wenn du Wert auf Genauigkeit legst, solltest du nicht gerade float nehmen.



  • Matlab ist sehr C-nah, vielleicht hast du das schon mitbekommen, d.h. Matlab verwendet die/C-Runtimelib (CRT), demzufolge gibt es keine Genauigkeitsunterschiede zw. Matlab und einem C-Programm, lediglich die Default-Anzeigegenauigkeit scheint sich zu unterscheiden.
    Beste Fließkommagenauigkeitsstellen bietet der Standardtyp long double, die max. garantierten Digit-Stellen (Vor- UND Nachkomma zusammen!) zeigt die Konstante LDBL_DIG an (>=10), und hängt von jeweiligen Compiler ab.
    Probiere mal auf deinem System

    printf("%d : %.19Lf",LDBL_DIG,1/6.l);
    


  • dummy2k schrieb:

    Hallo,

    ich habe in Matlab ein Skript(MEX) geschrieben, das mir bestimmte float-Werte berechnet. Um diese Daten zu überprüfen, habe ich ein analoges C-Skript.

    Bist du sicher, das du ein "MEX-Skript" hast und nicht einfach ein M-Skript? MEX ist eigentlich die Erweiterungsschnittstelle, um in C und anderen Sprachen geschriebene Module in Matlab einzubinden. Wenn du sowas hättest, würdest du die Frage vermutlich nicht oder anders stellen.

    Also geh ich von einem M-Skript aus. Matlab führt Rechnungen standardmäßig in double (entspricht double in C) aus. Wenn du single willst (entspricht float in C), musst du das explizit sagen:

    a = single(2.5);
    

    In C bekomme ich mit Float 6 Nachkommastellen und in Matlab wesentlich mehr. Was mich aber misstrauisch macht ist, dass nur 6 Nachkommastellen dargestellt werden.

    Passt, float hat um die 7 signifikanten Stellen, double etwa 15. Die Darstellung in Matlab kannst du mit dem Befehl format verändern, z.B.

    format long
    


  • SeppJ schrieb:

    float ist in der Regel nur auf 6-7 Dezimalstellen genau, für mehr musst du größere Datentypen benutzen. Oder meinst du die Ausgabe? Dazu guck dir die Dokumentation von printf an:
    www.cplusplus.com/reference/cstdio/printf/
    Mit einem Punkt kannst du also die Genauigkeit der Ausgabe beeinflussen.

    Hallo SeppJ,
    zuerst einmal ein Danke an alle für eure Mühe! Ich weiß, das wirklich zu schätzen 🙂

    Danke Sepp für den Link. Da das C-Skript(nicht von mir geschrieben) nur mit Float-Werte rechnet, brauche ich nur dementsprechend viele Nachkommastellen überprüfen, ob diese ident mit der Matlab-Version sind.
    Da du erwähnt hast, dass float in der Regel nur 6-7 Dezimalstellen genau ist (für mehr anderer Datentyp sinnvoll), werde ich "nur" 6 Dezimalstellen berücksichtigen.
    Ich denke, dass dies eine gerechtfertigte Begründung ist?

    Hintergrund der Sache ist, dass ich die Daten dann automatisiert abgleichen möchte. Dazu speichere ich die Werte von Matlab und der C Version jeweils in eine Txt-Datei und gleiche sie mit einem Tool automatisch ab (gibs sicher eine professionellere Lösung als das :-)).

    Bin für Kritik, Gegenvorschläge offen bzw. dankbar 🙂 Schöne Grüße!



  • Wutz schrieb:

    Matlab ist sehr C-nah, vielleicht hast du das schon mitbekommen, d.h. Matlab verwendet die/C-Runtimelib (CRT), demzufolge gibt es keine Genauigkeitsunterschiede zw. Matlab und einem C-Programm, lediglich die Default-Anzeigegenauigkeit scheint sich zu unterscheiden.
    Beste Fließkommagenauigkeitsstellen bietet der Standardtyp long double, die max. garantierten Digit-Stellen (Vor- UND Nachkomma zusammen!) zeigt die Konstante LDBL_DIG an (>=10), und hängt von jeweiligen Compiler ab.
    Probiere mal auf deinem System

    printf("%d : %.19Lf",LDBL_DIG,1/6.l);
    

    Danke Wutz für deinen Rat. Da aber das C-Skript (nicht von mir) nur mit Float-Werte rechnet, brauche ich nur dementsprechend viele Stellen berücksichtigen. Wenn ich das Posting vom Sepp richtig verstanden habe, ist Float nur bei 6-7 Stellen akkurat. Daher plane ich nur dementsprechend viele Stellen zu berücksichtigen 🙂



  • Bashar schrieb:

    dummy2k schrieb:

    Hallo,

    ich habe in Matlab ein Skript(MEX) geschrieben, das mir bestimmte float-Werte berechnet. Um diese Daten zu überprüfen, habe ich ein analoges C-Skript.

    Bist du sicher, das du ein "MEX-Skript" hast und nicht einfach ein M-Skript? MEX ist eigentlich die Erweiterungsschnittstelle, um in C und anderen Sprachen geschriebene Module in Matlab einzubinden. Wenn du sowas hättest, würdest du die Frage vermutlich nicht oder anders stellen.

    Also geh ich von einem M-Skript aus. Matlab führt Rechnungen standardmäßig in double (entspricht double in C) aus. Wenn du single willst (entspricht float in C), musst du das explizit sagen:

    a = single(2.5);
    

    In C bekomme ich mit Float 6 Nachkommastellen und in Matlab wesentlich mehr. Was mich aber misstrauisch macht ist, dass nur 6 Nachkommastellen dargestellt werden.

    Passt, float hat um die 7 signifikanten Stellen, double etwa 15. Die Darstellung in Matlab kannst du mit dem Befehl format verändern, z.B.

    format long
    

    Hallo Bashar, danke 🙂 Aber ich bin mir ganz sicher, dass ich ein Mex-Skript verwende. Über Matlab rufe ich das Mex-Skript(das C-Code enthält) auf, was mir paar Werte berechnet und gebe sie anschließend zurück an Matlab.
    Um zu überprüfen, ob die Werte korrekt sind, habe ich ein reines C-Skript(im Grunde das Mex-Skript nur ohne Mex-Befehle) was mir ebenfalls die Werte berechnet und gleiche sie dann mit dem Mex-Ergebnis ab.

    Derzeit habe ich vor, die Werte in einem Txt-File zu speichern und diese mit Hilfe eines Tools abzugleichen. Klingt glaub ich amateurhaft und wäre daher für Gegenvorschläge offen (bitte in einem akzeptablen Aufwand/Zeitrahmen) Danke! 🙂


Anmelden zum Antworten