Signatur
Beschreibung
Mit new Float16Array() legst du ein typisiertes Array an, dessen Elemente jeweils 2 Byte belegen und als Gleitkommazahlen mit halber Genauigkeit gespeichert werden. Das Format hat etwa 3 signifikante Dezimalstellen und einen Wertebereich bis ±65504. Beim Lesen bekommst du normale JavaScript-number-Werte zurück, beim Schreiben wird auf den nächsten darstellbaren binary16-Wert gerundet.
Gebraucht wird das vor allem dort, wo Speicher und Bandbreite wichtiger sind als Genauigkeit: WebGPU/WebGL (Texturen und Vertex-Daten im Format f16), Gewichte von Machine-Learning-Modellen, HDR-Bilddaten oder Binärformate, die Half-Floats enthalten. Gegenüber Float32Array braucht es nur halb so viel Speicher.
Wie alle TypedArray-Konstruktoren gibt es mehrere Aufrufformen:
new Float16Array()odernew Float16Array(length): ein mit Nullen gefülltes Array der angegebenen Länge.new Float16Array(typedArray): eine Kopie, bei der jeder Wert umgewandelt wird.new Float16Array(object): aus einem iterierbaren oder array-ähnlichen Objekt, z. B. einem normalen Array oder einemSet.new Float16Array(buffer, byteOffset, length): eine Sicht auf einen vorhandenenArrayBufferoderSharedArrayBuffer. Dabei wird nichts kopiert.
Du kannst den Konstruktor nur mit new aufrufen. Ein Aufruf ohne new wirft einen TypeError.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $length | number | 0 | Wenn der erste Parameter kein Objekt ist: Anzahl der Elemente. Das Array wird mit 0 gefüllt, belegt werden length * 2 Byte. |
| $typedArray | TypedArray | Ein anderes typisiertes Array, dessen Werte kopiert und in binary16 umgewandelt werden. Ein BigInt64Array oder BigUint64Array führt zu einem TypeError. |
|
| $object | Iterable|ArrayLike | Ein iterierbares oder array-ähnliches Objekt, z. B. [1, 2.5] oder ein Set. Jeder Wert wird mit Number() umgewandelt und dann gerundet. |
|
| $buffer | ArrayBuffer|SharedArrayBuffer | Speicherbereich, auf den die neue Sicht zeigt. Die Daten werden nicht kopiert, Änderungen wirken sich direkt auf den Buffer aus. | |
| $byteOffset | number | 0 | Byte-Position im buffer, an der die Sicht beginnt. Muss ein Vielfaches von 2 sein, sonst wird ein RangeError geworfen. |
| $length | number | (buffer.byteLength - byteOffset) / 2 | Anzahl der Elemente in der Sicht auf den Buffer. Ohne Angabe reicht die Sicht bis zum Ende des Buffers. Bei einem Buffer mit veränderbarer Größe wächst die Sicht dann automatisch mit. |
Rückgabewert
Float16Array-Objekt mit BYTES_PER_ELEMENT === 2.Beispiele
Leeres Array mit fester Länge anlegen
const weights = new Float16Array(4);
weights[0] = 0.5;
weights[1] = -1.25;
console.log(weights);
console.log(weights.byteLength); // 4 Elemente * 2 Byte
Aus einem normalen Array: Rundung und Überlauf
const values = new Float16Array([1.5, 0.1, 3.14159, 70000]);
console.log([...values]);
// 1.5 ist exakt darstellbar, 0.1 und π werden gerundet,
// 70000 liegt über dem Maximum von 65504
Sicht auf einen vorhandenen ArrayBuffer (z. B. Vertex-Daten für WebGPU)
const buffer = new ArrayBuffer(12);
// Sicht ab Byte 4 mit 3 Elementen, ohne Kopie
const normals = new Float16Array(buffer, 4, 3);
normals.set([0, 1, 0]);
console.log(normals.byteOffset, normals.length);
console.log(new Uint16Array(buffer)); // Rohbits: 1.0 = 0x3C00 = 15360
Funktionsprüfung mit Rückfall auf Float32Array
const createHalfBuffer = (data) =>
typeof Float16Array !== 'undefined'
? new Float16Array(data)
: new Float32Array(data); // Rückfall für ältere Umgebungen
const arr = createHalfBuffer([0.25, 0.75]);
console.log(arr.constructor.name, arr.BYTES_PER_ELEMENT);
// Wichtig · Fallstricke
Genauigkeit: binary16 hat nur 10 Bit Mantisse, also etwa 3 Dezimalstellen. Ganze Zahlen sind nur bis 2048 exakt darstellbar. Werte ab 65520 werden zu Infinity, sehr kleine Werte zu 0 oder Subnormalzahlen. Für Summen, Zähler und Geldbeträge ist der Typ ungeeignet. Einzelne Werte rundest du mit Math.f16round() genauso wie beim Speichern.
Ausrichtung: byteOffset muss durch 2 teilbar sein. Bei buffer.byteLength - byteOffset muss das ebenfalls gelten, wenn du keine length angibst. Sonst wird ein RangeError geworfen. Für unausgerichtete Zugriffe oder eine feste Byte-Reihenfolge nimmst du DataView.prototype.getFloat16() bzw. setFloat16().
Byte-Reihenfolge: Es gilt die Reihenfolge der Plattform, in der Praxis fast immer Little-Endian. Für Dateiformate und Netzwerkprotokolle ist DataView deshalb die sicherere Wahl.
Kompatibilität: Neu in ES2025. Unterstützt ab Chrome/Edge 135, Firefox 129, Safari 18.2 und Node.js 24. In älteren Umgebungen ist Float16Array undefined. Prüfe deshalb vorher mit einer Funktionsprüfung oder binde ein Polyfill ein, etwa @petamoriken/float16. TypeScript kennt den Typ erst mit lib: ["ESNext"] bzw. ES2025.
Ein Aufruf ohne new, also Float16Array([1]), wirft einen TypeError.