- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 31

Thema: ESP32 berechnet floats falsch im Vergleich zu M4 und Due/M3

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    ja hat er und die FPU ist auch heiß diskutiert, da die verwendung unnötig viel maschinencode fabriziert .. das ding scheint fischig zu sein abre ich ha immer noch nichnt raus wie ich bei den baordfiles oder in arduino die FPU integration abschalte ... mein spinnensinn klingelt bei der FPU integration, wenn ich sie abschalten kann und die stnadard math verwenden könnte könnte man es ausschließen.
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  2. #2
    HaWe
    Gast
    Zitat Zitat von Ceos Beitrag anzeigen
    ja hat er und die FPU ist auch heiß diskutiert, da die verwendung unnötig viel maschinencode fabriziert .. das ding scheint fischig zu sein abre ich ha immer noch nichnt raus wie ich bei den baordfiles oder in arduino die FPU integration abschalte ... mein spinnensinn klingelt bei der FPU integration, wenn ich sie abschalten kann und die stnadard math verwenden könnte könnte man es ausschließen.
    ja, ich las gerade:
    5.9.6 Floating Point Aritmetic
    The ESP32 supports hardware acceleration of single precision floating point arithmetic (float) via Floating Point
    Units (FPU, also known as coprocessors) attached to each core. The use of the FPUs imposes some behavioral
    restrictions on ESP-IDF FreeRTOS.
    ESP-IDF FreeRTOS implements Lazy Context Switching for FPUs. In other words, the state of a core's FPU registers
    are not immediately saved when a context switch occurs. Therefore, tasks that utilize float must be pinned to a
    particular core upon creation. If not, ESP-IDF FreeRTOS will automatically pin the task in question to whichever core
    the task was running on upon the task's first use of float. Likewise due to Lazy Context Switching, interrupt service
    routines must also not use float.
    allerdings tritt der Fehler ja auch bei fp64 auf, was die 32bit-FPU nicht betreffen würde.... :

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    Ich würde es gerne dennoch ausschließen, komme aber mit Sicherheit nicht vor dem Wochenende dran mich mit den Boardfiles und den innereien von Arduino zu beschäftigen um die Verwendung der "unmodifizierten" math library zu erzwingen ... es kann ja auch sein, dass in der Math Lib Variante für den ESP32 ein grundlegender Fehler existiert ... um für den ESP12 zu compilen benötigt man ja das Espressive Framework und da steckt ziemlich viel code drin der Fehlerbehaftet sein kann
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  4. #4
    HaWe
    Gast
    Zitat Zitat von Ceos Beitrag anzeigen
    Ich würde es gerne dennoch ausschließen, komme aber mit Sicherheit nicht vor dem Wochenende dran mich mit den Boardfiles und den innereien von Arduino zu beschäftigen um die Verwendung der "unmodifizierten" math library zu erzwingen ... es kann ja auch sein, dass in der Math Lib Variante für den ESP32 ein grundlegender Fehler existiert ... um für den ESP12 zu compilen benötigt man ja das Espressive Framework und da steckt ziemlich viel code drin der Fehlerbehaftet sein kann
    klar, perfekt wenn du darüber was rauskriegst!

  5. #5
    HaWe
    Gast
    Ein User aus dem Arduino Forum hat die Ursache gefunden!
    Es lag an der Funktion abs()
    Bei Arduino kann die auch auf float angewendet werden, bei ESP32 aber nicht, hier muss man fabsf() für float bzw. fabs() für double verwenden.
    http://forum.arduino.cc/index.php?to...633#msg4158633
    Nun kommen endlich auch die ESP- und die Linux-Astronauten-Crews an der Tranquiity Base an!
    Geändert von HaWe (02.05.2019 um 20:27 Uhr)

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    das sind die Details die ich meine ... bei einem Pic kann man einfach "int32 / int8" rechnen und bekommt ein speicherfressendes befehlsmonster vom compiler oder aber man nimmt die spezielle Funktion nur für den Pic und bekommt eine schlanke Operation die ohne zusätzlichen Speicher auskommt und in nur ein paar Takten abgeschlossen ist

    interessant aber dass abs tatsächlich nur für int definiert ist (was ich auf die schnelle aus 3 referenzen rausgelesen habe)
    arduino das aber absolut typlos dokumentiert
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  7. #7
    HaWe
    Gast
    Zitat Zitat von Ceos Beitrag anzeigen
    das sind die Details die ich meine ... bei einem Pic kann man einfach "int32 / int8" rechnen und bekommt ein speicherfressendes befehlsmonster vom compiler oder aber man nimmt die spezielle Funktion nur für den Pic und bekommt eine schlanke Operation die ohne zusätzlichen Speicher auskommt und in nur ein paar Takten abgeschlossen ist

    interessant aber dass abs tatsächlich nur für int definiert ist (was ich auf die schnelle aus 3 referenzen rausgelesen habe)
    arduino das aber absolut typlos dokumentiert
    ja, und überraschend war ja auch, dass sogar ein Linux PC mit g++ den selben C++ Rechen-Code mit denselben (durch abs(float) verfälschten) Ergebnissen erzeugt hat, im Gegensatz zu Arduino-abs. Offenbar verwendet Arduino Macros dafür, anders als es in C/C++ <cmath> standardmäßig definiert ist
    https://github.com/arduino/ArduinoCo.../Arduino.h#L94

    edit: auch std:: kennt abs, fabs und fabsf
    https://en.cppreference.com/w/cpp/numeric/math/fabs

    erst ab C++17 gibt es ein abs() für alle:
    (since C++17)
    float abs( float arg );
    (1)
    double abs( double arg );
    Geändert von HaWe (03.05.2019 um 19:06 Uhr)

Ähnliche Themen

  1. Integer oder Floats in Bytes auftrennen
    Von ElchiMtr im Forum C - Programmierung (GCC u.a.)
    Antworten: 6
    Letzter Beitrag: 30.05.2013, 20:52
  2. Wie berechnet man das Haltemoment?
    Von Elvid im Forum Motoren
    Antworten: 5
    Letzter Beitrag: 08.11.2012, 10:08
  3. Antworten: 5
    Letzter Beitrag: 07.08.2008, 16:38
  4. Wie wurde der Spannungsverdoppler berechnet?
    Von Charly_cs im Forum Elektronik
    Antworten: 4
    Letzter Beitrag: 31.08.2005, 12:19
  5. Wie berechnet man Geschwindigkeit
    Von Alexander im Forum Mechanik
    Antworten: 6
    Letzter Beitrag: 28.02.2004, 22:06

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress