Ich hätte eine Anforderung zur Anpassung einer Software in unserer UC-Landschaft, konkret Umstellung auf eine hochgenaue FloatingPoint-Berechnung. Die Standardmäßigen LIBs in C bieten aber auch mit long nicht die benötigte Auflösung um es automatisch, also ohne Code-Umschreiben zu konvertieren. Ich suche so eine Art Library, die mit 64 Bit Float umgehen kann und auf einem 16 Bit-Prozessor läuft. Das Tempo ist nebensächlich, da UC ausreichend wenig beschäftigt. Kennt einer etwas?
Andi schrieb: > Die Standardmäßigen LIBs in C bieten aber auch mit long nicht die > benötigte Auflösung um es automatisch, also ohne Code-Umschreiben zu > konvertieren. ??? Long ist schon mal definitiv kein Gleitkommatyp! > Ich suche so eine Art Library, die mit 64 Bit Float umgehen kann und auf > einem 16 Bit-Prozessor läuft. Auf welchem? Mit welchem Compiler? Troll oder Vollidiot, das ist hier die Frage... Aber zumindest kann man wohl schon sicher sagen, dass es ohne Umschreiben der Originalquellen wohl nicht abgehen wird...
Andi schrieb: > da UC ausreichend wenig beschäftigt. Also simples Programm? Auf Cortex-M4 portieren, "double" nutzen, fertig.
Ob S. schrieb: > ??? Long ist schon mal definitiv kein Gleitkommatyp! Schön, daß du das erkennt hast. Daher suche ich eine Gleitkomma-Lib. Ob S. schrieb: > Auf welchem? Mit welchem Compiler? Leseprobleme? Ich suche ein allgemeine LIB - unabhängig vom Controller. Ob S. schrieb: > roll oder Vollidiot, das ist hier die Frage... Benimmprobleme?
Andi schrieb: > konkret Umstellung auf eine hochgenaue FloatingPoint-Berechnung. > Die Standardmäßigen LIBs in C bieten aber auch mit long nicht die > benötigte Auflösung um es automatisch, also ohne Code-Umschreiben zu > konvertieren. Welcher uC soll das sein, der kein float bzw. double im (Gnu) C Compiler anbietet ?
Michael B. schrieb: > Welcher uC soll das sein, der kein float bzw. double im (Gnu) C Compiler > anbietet ? Einen long double! Der OP fragte nach long double, da double nicht genügend genau! Die Antwort auf deine eigentliche Frage: Vermutlich so einige.
1 | float f = 1.0; |
2 | double d = 1.0; |
3 | long double ld = 1.0; |
gcc (Linux) erzeugt 32/64/128bit Fließkomma. arm-none-eabi-gcc erzeugt 32/64/64bit Fließkomma. avr-gcc macht vergnüglich aus allen dreien einen simplen float(32bit).
:
Bearbeitet durch User
Norbert schrieb: > Der OP fragte nach long double, da double nicht > genügend genau! Andi schrieb: > 64 Bit Float 64bit float ist aber "double". 32bit ist (single-precision) "float". "long double" wäre 128bit.
Niklas G. schrieb: > Norbert schrieb: >> Der OP fragte nach long double, da double nicht >> genügend genau! > > Andi schrieb: >> 64 Bit Float > > 64bit float ist aber "double". 32bit ist (single-precision) "float". > "long double" wäre 128bit. Das ist ein Irrtum, bzw. Implementationsabhängig. Beim gcc wird zB. ›long double‹ als 16 Byte abgespeichert, ist aber nur eine 80bit Fließkommazahl. Will man noch mehr, dann kann man aber problemlos auf echte 128bit steigern.
1 | #include <stdio.h> |
2 | #include <quadmath.h> |
3 | |
4 | float f = 1.0; // 23bit - 6.9 signifikant |
5 | float fi = 1.0 / 2.0; |
6 | double d = 1.0; // 52bit - 15.7 signifikant |
7 | double di = 1.0 / 2.0; |
8 | long double ld = 1.0; // 63bit - 18.9 signifikant |
9 | long double ldi = 1.0 / 2; |
10 | __float128 f128 = 1.0; // 112bit - 33.7 signifikant |
11 | __float128 f128i = 1.0 / 2; |
12 | __float128 f128end = 2.0; |
13 | |
14 | int main(void) { |
15 | char buf[256]; |
16 | int i = 0; |
17 | while (1) { |
18 | printf("%3d %.25f \n", i, f); |
19 | printf("%3d %.54f \n", i, d); |
20 | printf("%3d %.65Lf \n", i, ld); |
21 | quadmath_snprintf(buf, sizeof buf, "%.114Qf", f128); |
22 | printf("%3d %s \n", i, buf); |
23 | if (f128 >= f128end) |
24 | break; |
25 | f += fi; fi /= 2.0; |
26 | d += di; di /= 2.0; |
27 | ld += ldi; ldi /= 2.0; |
28 | f128 += f128i; f128i /= 2.0; |
29 | i++; |
30 | }
|
31 | return 0; |
32 | }
|
33 | |
34 | gcc -Wall -Wextra -pedantic -std=c11 -no-pie -Os -o "float" "float.c" -lquadmath |
:
Bearbeitet durch User
Hi, 2007 habe ich eine 64 Bit emulation der 4 Grundrechenarten geschrieben Beitrag "64 Bit float Emulator in C, IEEE754 compatibel" Die haben andere erweitert und auf trigonometrische Funktionen ausgedehnt. Es gibt auch andere Implementierungen, die in dem thread verglichen werden. Die von mir initiierte war die größte und langsamste :-| Cheers Detlef PS: Die 64 Bit Emulation habe ich geschrieben weil ich dachte ich benötige sie. Das war aber ein Irrtum und ein Designfehler. 32Bit float geben Dir ca. 120dB Dynamik. Wenn Du damit nicht auskommst liegt womöglich ein designflaw vor.
:
Bearbeitet durch User
Detlef _. schrieb: > 32Bit float … Wenn Du damit nicht auskommst liegt > womöglich ein designflaw vor. ;-) 12345.000000 + 0.010000 = 12345.009766 Manchmal reichen <7 (6.923) signifikante Stellen eben nicht aus.
Norbert schrieb: > Will man noch mehr, dann kann man aber problemlos auf echte 128bit > steigern. Das ist gut! Danke.
Detlef _. schrieb: > PS: Die 64 Bit Emulation habe ich geschrieben weil ich dachte ich > benötige sie. Das war aber ein Irrtum und ein Designfehler. 32Bit float > geben Dir ca. 120dB Dynamik. Wenn Du damit nicht auskommst liegt > womöglich ein designflaw vor. Moment, ein 32 bit float sollte eine weitaus höhere Dynamik liefern (>1000 dB). Außerdem geht es hier ja um die Genauigkeit, nicht um die Dynamik.
Mit Dynamik ist hier die Rechendynamik gemeint, wieviel gültige Stellen Du hast. Das hat mit dem abgedeckten Zahlenbereich nichts zu tun. Bei 32Bit float sind 23 Bit Mantisse, Rest Exponent. 20*log10(2^23)=138dB, naja, close enough. Cheers Detlef
Detlef _. schrieb: > 20*log10(2^23)=138dB, So sieht die Marketing Darstellung aus… Bleiben aber trotzdem weniger als sieben signifikante Stellen.
Detlef _. schrieb: > Mit Dynamik ist hier die Rechendynamik gemeint, wieviel gültige > Stellen > Du hast. Das hat mit dem abgedeckten Zahlenbereich nichts zu tun. Bei > 32Bit float sind 23 Bit Mantisse, Rest Exponent. 20*log10(2^23)=138dB, > naja, close enough. Sofern ich mich richtig erinnere, gibt es ein implizites bit. Außerdem wird hier meist von precision / Genauigkeit gesprochen und es wird zumeist auch nur in Dezimalstellen angegeben. Das ist, finde ich, deutlich zugänglicher. -> log10(2^24) -> 7.22 Dezimalstellen Genauigkeit. Aber manchmal reicht das halt nicht.. :-)
Lars schrieb: > Außerdem > wird hier meist von precision / Genauigkeit gesprochen und es wird > zumeist auch nur in Dezimalstellen angegeben. Das ist, finde ich, > deutlich zugänglicher. Nur Nicht-Programmierer liebäugeln mit irgendwelchen Dezimalstellen. Programmierer wissen: Es gibt in ihrer Maschine nur Dualstellen (AKA: Bits).
Lars schrieb: > Moment, ein 32 bit float sollte eine weitaus höhere Dynamik liefern > (>1000 dB). Das ist ein Kindergartenrechnung, Entschuldigung. > Außerdem geht es hier ja um die Genauigkeit, nicht um die > Dynamik. Das hängt direkt zusammen. Ob S. schrieb: > Nur Nicht-Programmierer liebäugeln mit irgendwelchen Dezimalstellen. > Programmierer wissen: Es gibt in ihrer Maschine nur Dualstellen (AKA: > Bits). Wenn man das Umskalieren jeweils richtig macht, ja. Das gibt aber in float auch wieder Rundungsprobleme. Daher entweder 64 Bit float mit entsprechender Behandlung oder einen "double double" mit 128 Bit global. Wahrscheinlich täten es auch 72 Bit.
Andi schrieb: > Lars schrieb: >> Moment, ein 32 bit float sollte eine weitaus höhere Dynamik liefern >> (>1000 dB). > Das ist ein Kindergartenrechnung, Entschuldigung. Ist es nicht, das ist Fakt. >> Außerdem geht es hier ja um die Genauigkeit, nicht um die >> Dynamik. > Das hängt direkt zusammen. Aha, inwiefern? Dynamikumfang und Genauigkeit sind zwei unterschiedliche Dinge. Ob S. schrieb: > Nur Nicht-Programmierer liebäugeln mit irgendwelchen Dezimalstellen. Steile These. > Programmierer wissen: Es gibt in ihrer Maschine nur Dualstellen (AKA: > Bits). Danke, dass du dieses Geheimnis mit uns teilst.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.