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


von Andi (chefdesigner)


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 Andi (chefdesigner)


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 Andi (chefdesigner)


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