Forum: Digitale Signalverarbeitung / DSP / Machine Learning welche FP-LIB für hochaufgelöstes Rechnen beim 16 BIT uc


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Andreas U. (Gast)


Lesenswert?

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?

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

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

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Andi schrieb:
> da UC ausreichend wenig beschäftigt.

Also simples Programm? Auf Cortex-M4 portieren, "double" nutzen, fertig.

von Andreas U. (Gast)


Lesenswert?

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?

von Dergute W. (derguteweka)


Lesenswert?

Moin,

GMP?
https://gmplib.org/

Gruss
WK

von Andreas U. (Gast)


Lesenswert?

Das könnte etwas sein. Danke!

von Michael B. (laberkopp)


Lesenswert?

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 ?

von Norbert (der_norbert)


Lesenswert?

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
von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

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.

von Norbert (der_norbert)


Lesenswert?

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
von Detlef _. (detlef_a)


Lesenswert?

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
von Norbert (der_norbert)


Lesenswert?

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.

von Andreas U. (Gast)


Lesenswert?

Norbert schrieb:
> Will man noch mehr, dann kann man aber problemlos auf echte 128bit
> steigern.

Das ist gut! Danke.

von Lars (rezyy)


Lesenswert?

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.

von Detlef _. (detlef_a)


Lesenswert?

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

von Norbert (der_norbert)


Lesenswert?

Detlef _. schrieb:
> 20*log10(2^23)=138dB,
So sieht die Marketing Darstellung aus…

Bleiben aber trotzdem weniger als sieben signifikante Stellen.

von Lars (rezyy)


Lesenswert?

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

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

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

von Andreas U. (Gast)


Lesenswert?

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.

von Lars (rezyy)


Lesenswert?

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
Noch kein Account? Hier anmelden.