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?







Zitieren

Lesezeichen