welche FP-LIB für hochaufgelöstes Rechnen beim 16 BIT uc

Gast #7701494
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?

(Firma: 1984now) #7701568
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...

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

#7702993
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
#7703368
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.

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

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

(Firma: 1984now) #7704834
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).

Gast #7705157
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.

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren