begrenzte Fähigkeit des Atmel328p Kommazahlen mit ausreichend hoher Genauigkeit

Also ich spiele mit Arduino und weiße nicht , warum mein Code nicht funktionniert.
Ich möchte eine additon mit großer Zahlen führen. Die Zahlen haben Festkommazahlen.
Bsp a =150000000.5 und b= 0.5;

ich führe c= a+b durch ;
oder die Multiplikation von a mal b geht auch.(c=a*b)

Leider der Kompiler vernachlässigt immer meine Kommastelle. bezugsweise meine (0.5) hintere Stelle.
Ich weiße es nicht, wie ich das Problem lösen kann.
gibt es eine Bibliothek, die die Floating-Point oder double -Werte Berechnungen emuliert kann.

#include <SPI.h> 
#include<math.h>


void setup() {

Serial.begin (9600);

uint32_t RF= 150000003.5;

double b= 3.5;

 double k= RF+b;

 Serial.println(RF);
 Serial.println(k);
  
   
}

bild berechnung.PNG

Völlig normal. Das ist auch auf dem PC nicht anders. Auf 8-Bit Arduinos ist float das gleiche wie double. Was 6-7 signifikante Stellen (d.h. alle Ziffern!) bedeutet.

Nimm einen 32-Bit Arduino. Dann hat double 64 Bit

uint32_t RF= 150000003.5;

Das ist zwar erlaubt, aber wohl nicht was du denkst, wenn du dir schon die Mühe mit der Tipperei machst.

Nimm einen 32-Bit Arduino

Warum soll überhaupt ein µC sowas machen?

Oh ja, dass das uint32_t hatte ich ganz übersehen. Aber auch mit float geht das nicht wirklich.

sianna:
Leider der Kompiler vernachlässigt immer meine Kommastelle.

ALLE Gleitkommazahlen, egal ob 32-bit 'float' oder 64-bit 'double' lassen sich als Dezimalzahlen immer(!) nur mit begrenzter Genauigkeit ausgeben.

Denn die interne Darstellung von Gleitkommazahlen besteht NICHT aus einer Dezimaldarstellung, sondern aus BINÄREN Werten für "Mantisse und Exponent".

Wenn Du das in eine Dezimalzahl umwandelst, dann ist die dezimale Genauigkeit von float bei 6-7 "signifikanten Stellen. Bei double kannst Du 15 signifikante Stellen erwarten. Mehr Genauigkeit gibt es bei Gleitkommazahlen nicht.

Also wenn Du mit Gleitkommazahlen 1.0 und 2.0 zusammenzählst, dann kommt nicht bis auf 20 Stellen nach dem Komma 3.00000000000000000000 heraus, sondern "irgendwas ganz nahe bei 3".

Das ist systembedingt, weil sich dezimale Zahlen nicht hunderprozentig exakt in einer Mantisse in Binärformund einem Exponenten in Binärform ,mit beliebiger Anzahl gültiger Stellen darstellen lassen.

Bei float hast Du nur 6-7 signifikante Stellen, bei double 15.

Wenn Du mehr signifikante Stellen brauchst: VERMEIDE 'float' und verwende stattdessen lange Integer-Formate wie "long" oder "long long" in Berechnungen! Ein 32-Bit 'long' hat zwei signifikante Stellen mehr als ein 32-Bit 'float'.

Bei den Arduino Atmega-Plattformen ist die Deklaration von double dasselbe wie float.

Echte double Genauigkeit erreichst Du mit 32-Bit Platformen wie den ARM Cortex basierten Arduino-Boards (DUE und Co.). Und auf Atmegas mit speziellen Libraries, die aber schleichend langsam sind, weil dabei fehlende Hardwarebefehle in Software nachprogrammiert "emuliert" werden müssen.

Welche spezielle Libraries meinst du? und der arduino kann leider kein long double verarbeiten.

sianna:
Welche spezielle Libraries meinst du?

Na "spezielle" eben. Da gibt es verschiedene, je nach Anwendungszweck und je nachdem, wofür Du es brauchst. Es gibt Libraries, mit denen kannst Du die Grundrechenarten Plus, Minus, Malnehmen, Teilen, bis auf hundert Stellen nach dem Komma ausführen. Oder mit hundertstelligen ganzen Zahlen rechnen, wie es für manche Kryptografieanwendungen notwendig ist (256-Bit Verschlüsselung erfordert schon recht lange Zahlen, die auch den Bereich von 64-Bit 'double' sprengen). Es gibt wohl auch eine für trigonometrische Berechnungen. Und am Ende sogar eine, die Ergebnisse so herausbekommt, dass die 64 Bits kompatibel zu einer IEEE54 "double" Gleitkommazahl sind, so das Du diese 64 Bits rüber auf eine andere Plattform schieben könntest, die IEEE754 "double" unterstützt, und dann auf der anderen Plattform damit weiterrechnen könntest.
Es gibt schon einiges, was Mathe-Cracks für die 8-Bit Atmega-Plattform zusammengeklöppelt haben. Sinnvoll anwenden läßt sich davon kaum etwas. Entweder die "spezielle Library" ist "zu speziell". Oder "zu langsam" für irgendwas brauchbares. Manches davon kannst Du mit Google finden. Und manches, was Teilnehmer im englischen Teil dieses Forums programmiert haben, wohl auch über die Forumssuche.