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