Bei Verwendung von float hast du bei den angegebenen Werten einen relativen Fehler von ca 1.7*10^{-8} \approx 2^{-25}. Bei 23 Bit Mantisse codiert das niederwertigste Bit für 2^{-24}, also besteht kein Anlass zur Sorge.Zitat von surfer
avr-gcc unterstützt intern nur float (1 Sign, 23 Mant, 7 Expo). Auch Verwendung von double hilft nicht weiter, da die libgcc2 für avr-gcc nur für SFmode (float) generiert ist. Verwendung von double bringt lediglich Overhead beim Umwandeln und mehr Speicherverbrauch. Falls du höhere Genauigkeit benötigst, dann
- Benötigst du überhaupt höhere Genauigkeit? Oder ist es ein ästhetisches Problem?
- eigene Bibliothek implementieren: Unterstützung für
-- double (1 Sign, 56 Mant, 11 Expo) oder
-- long double (1 Sign, 64 Mant, 15 Expo)
-- floats nach eingenem Gusto
-- Fixpunkt-Arithmetik nach eigenem Gusto
-- exakte Arithmetik nach eigenem Gusto (ganze Zahlen, rationale Zahlen oder Erweiterungskörper von Q)- eigene Version von avr-gcc generieren, die double bzw long double unterstützt. Die Quellen hast du
![]()
Dazu müssen Anpassungen im GCC-Backend für AVR gemacht werden.- entsprechende Bibliothek besorgen (kaufen / in Auftrag geben), CA-System (Computer-Algebra)
sprintf() ist ANSI-C, die %-Modifier müssen zu den Typen passen. Wenn du mit % einen 8-Byte-Wert angibst, lieferst aber nur 4 Bytes ab, dann sei froh, daß du einen Compilezeit-Fehler/Warnung bekommst, und nicht einen Laufzeitfehler wegen Stapel-Korruption!
Was bitte meinst du mit *GENAU*???Zitat von surfer
Ein Rechner ist bestenfalls so schlau wie das Programm, das auf ihm läuft
Wie sieht eine genaue Darstellung von sin(1) deiner Meinung nach aus?
Bist du dir klar über die mathematischen/algorithmischen Grundlagen von dem, was du tun willst?
Lesezeichen