float16_t für AVR?

#6831673
Lesenswert?

Nie gesehen, sorry.

Ich kann mir auch kaum vorstellen, daß es für irgendwas sinnvoll ist mit 
nicht mal dreieinhalb Stellen Genauigkeit und einem Wertebereich, den 
man auch leicht mit ganzen Zahlen erreicht.

Das soll wohl gelegentlich im Grafikbereich verwendet werden, aber da 
kommt man mit einem AVR auch nicht weit.

Sicher, daß Festkommazahlen nicht interessanter sind?
Gast #6831674
Lesenswert?

Zu float16_t kann ich nichts schreiben. Für entsprechende Anwendungen 
verwende ich auf den AVRs Fixed-Points.

Auszug:
1
#include <avr/io.h>
2
#include <math.h>
3
#include <stdint-gcc.h>
4
#include <stdfix.h>
5

6
...
7

8
#define samples 64
9

10
...
11

12
_Fract v[samples];
13

14
...
Gast #6831768
Lesenswert?

Klaus W. schrieb:
> Ich kann mir auch kaum vorstellen, daß es für irgendwas sinnvoll ist mit
> nicht mal dreieinhalb Stellen Genauigkeit und einem Wertebereich, den
> man auch leicht mit ganzen Zahlen erreicht.

Der TO interessiert sich ja auch nur dafür. Von irgend einer sinnvollen 
Anwendung stand da nichts.

Abgesehen davon: Float-Formate aller Art haben in Verbindung mit dem 
Wunsch nach einer Art MAC-Operation eigentlich nur einen Sinn, wenn sie 
in Hardware und dabei effektiv nur in einem Takt berechenbar sind. So 
etwas ist definitiv bei einem AVR nicht der Fall.

W.S.
Gast #6831922
Lesenswert?

Klaus W. schrieb:
> Ich kann mir auch kaum vorstellen, daß es für irgendwas sinnvoll ist mit
> nicht mal dreieinhalb Stellen Genauigkeit und einem Wertebereich, den
> man auch leicht mit ganzen Zahlen erreicht.

Bei float hast du immer die gleiche Anzahl gültiger Stellen, bei ganzen 
Zahlen nicht. Für Rechenoperationen mit Multiplikationen daher sehr gut 
vorstellbar.
#6831972
Lesenswert?

Wolfgang schrieb:
> Bei float hast du immer die gleiche Anzahl gültiger Stellen, bei ganzen
> Zahlen nicht. Für Rechenoperationen mit Multiplikationen daher sehr gut
> vorstellbar.

Das ist mir schon klar.
In der Theorie ein echter Vorteil. Bei float16_t ist aber (wenn ich mich 
nicht täusche) der Exponent 5 Bits lang. Dann kommt man von 
Zehntausendstel bis gerade mal um die 65000 als Wertebereich. Das kann 
man mit Festkomma auch leicht haben, und hat viel weniger Rechenaufwand, 
gerade bei einem AVR sucht man eher keine Rechenzeitfresser.

Gleitkomma lohnt doch erst, wenn man wirklich einen größeren Bereich 
braucht und sich dabei nur eine begrenzte Anzahl Stellen für die 
Genauigkeit gönnen will.

W.S. schrieb:
> Der TO interessiert sich ja auch nur dafür. Von irgend einer sinnvollen
> Anwendung stand da nichts.

Stimmt, Spielen reicht als Motivation. Dagegen sage ich nichts.
Wollte nur erwähnen, daß der praktische Nutzen wahrscheinlich limitiert 
ist.
#6832017
Lesenswert?

Der Tradeoff liegt zwischen Anzahl Stellen, und Wertebereich. Nehmen 
wird 2 Stellen, sind das 7 bit mantisse plus vorzeichen, also 8 bit. 
Dann waeren 8 Bit uebrig fuer den Exponenten, auch 7 bit plus 
Vorzeichen. Also bis 128 nach links oder rechts schieben. Das ist doch 
sehr ueppig.
Weniger Werteberich waere auch passend. Nehmen wir 30 Shifts nach rechts 
und links, da wuerden 5 bits Exponent reichen, und wuerden 10 Bit 
Mantisse lassen. Das waeren dann 3 Stellen.
Gast #6832162
Lesenswert?

Wenn Du es Dir einfach, aber dafür nicht ganz so schnell machen willst: 
Nimm bfloat16, das ist der normale float mit verkürzter Mantisse. Du 
speicherst einfach die unteren zwei Byte der Mantisse nicht. Beim laden 
"bläst" Du das auf und nimmst dann die float-Operationen .
Gast #6832563
Lesenswert?

Klaus W.
>Hier sind welche erwähnt:
>https://stackoverflow.com/questions/5766882/why-is-there-no-2-byte-float-and-does-an-implementation-already-exist
>Vielleicht ein Startpunkt?

Danke für den interessanten Link. Erstaunlich, wie aufwendig die 
Multiplikation und die Addition realisiert ist (ganz am Schluss im 
Code). Schnell sieht das nicht aus.

float16_t nennt sich wohl auch "half precision float":
https://en.wikipedia.org/wiki/Half-precision_floating-point_format#IEEE_754_half-precision_binary_floating-point_format:_binary16

Das Format findet sich vielfach in der CMSIS-DSP:
https://www.keil.com/pack/doc/CMSIS/DSP/html/group__FIR.html#ga9b5e4d748609deea033ce74fade70f78

Ich nehme mal an, es gibt einige ARMs, die das Format in ihren 
Recheneinheiten unterstützen.
Angehängte Dateien:
Gast #6832665
Lesenswert?

Peter D. schrieb:
> Klaus W. schrieb:
>> Wollte nur erwähnen, daß der praktische Nutzen wahrscheinlich limitiert
>> ist.
>
> Wie schon gesagt wurde, Bildverarbeitung z.B. auf einem FPGA. Ansonsten
> ist das Quatsch, insbesondere auf einem AVR.

Es wird wohl hauptsächlich für neuronale Netze eingesetzt. Direkte 
Hardwareunterstützung gibts es meines Wissens nur in neueren GPUs, dort 
dann aber mit bis zu 400 TFlop/s (NVidia A100), und einigen FPGAs (z.B. 
Intel Arria 10). X86 können nicht direkt damit rechnen aber es gibt 
Assemblerbefehle um Half-Floats als Speicherformat zu verwenden.

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