Start · Sprachen · JavaScript · Referenz · new Float16Array()

new Float16Array()

Methode

Der Konstruktor <code>Float16Array()</code> erzeugt ein typisiertes Array aus 16-Bit-Gleitkommazahlen (halbe Genauigkeit, IEEE 754 binary16) in Plattform-Byte-Reihenfolge.

seit JavaScript ES2025 · Baseline 2025 (Chrome/Edge 135+, Firefox Kategorie: method-property

Signatur

new Float16Array(lengthOrSource?, byteOffset?, length?)

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() oder new 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 einem Set.
  • new Float16Array(buffer, byteOffset, length): eine Sicht auf einen vorhandenen ArrayBuffer oder SharedArrayBuffer. 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

Typ
Float16Array
Beschreibung
Ein neues 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
Float16Array(4) [0.5, -1.25, 0, 0] 8

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
[1.5, 0.0999755859375, 3.140625, Infinity]

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
4 3 Uint16Array(6) [0, 0, 0, 15360, 0, 0]

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);
Float16Array 2

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