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 21:27 Uhr)
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.
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 20:06 Uhr)
Lesezeichen