Rechengenauigkeit Arduino - Excel

Hallo :slight_smile: ,

ich hätte mal eine Frage bezüglich der Genauigkeit der Berechnungen von Arduino.

Ich dividiere innerhalb der Arduino Umgebung zwei float-Werte und lasse mir diese ausgeben (auf 4 Nachkommastellen). Wenn ich die selbe Division jetzt mittels Excel durchführe bekomme ich jedoch unterschiedliche Divisionsergebnisse.
z.B. (-9,1514)/(-0,1748)

Excel liefert mir 52,3535
Arduino liefert mir 52,3423

Ich habe mir jetzt überlegt, dass es vielleicht daran liegen könnte, dass Arduino die Float-Werte mit 32Bit speichert und Excel mit 64 Bit.
Bin mir da aber wirklich noch unsicher und da es Teil einer Projektarbeit ist, wäre es nicht schlecht, wenn meine Behauptung stimmt :sweat_smile:

Würde mich freuen, wenn mir jemand erklären könnte, woran das wirklich liegt bzw. mir zustimmt :grin:

Liebe Grüße

32 Bit Floats haben nur 6-7 signifikante Stellen. Das ist du hier erreicht. Außerdem hast du generell Rundungsfehler

Siehe hier:
https://www.h-schmidt.net/FloatConverter/IEEE754de.html
52.3435 kann nicht genau dargestellt werden

Ich habe mir jetzt überlegt, dass es vielleicht daran liegen könnte, dass Arduino die Float-Werte mit 32Bit speichert und Excel mit 64 Bit.
Bin mir da aber wirklich noch unsicher und da es Teil einer Projektarbeit ist, wäre es nicht schlecht, wenn meine Behauptung stimmt

Deine Vermutung ist richtig :slight_smile:
Auch das Excel-Ergebnis ist übrigens nur ein Näherungswert.
Und woher du z.B. die -0,1748 hast, will ich gar nicht wissen :stuck_out_tongue:

In C++ gibt es die Datentypen double und float. Berechnungen werden mit double gemacht.
Bei richtigen Rechnern sind das 64 bzw. 32 bit Gleitkommazahlen, und die Berechnungen macht die CPU in Hardware, bei 8bit - Arduinos müssen float Berechnungen in Software gemacht werden und double sind auch nur 32 bit Zahlen (beim avr-gcc Compiler).

In C++ gibt es die Datentypen double und float.

Und long double.
Welches aber meist nur ein Alias für double ist.
Eigentlich nur bei µP mit extra breiter FPU hat long double mehr signifikante Stellen.