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.
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.
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.
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.