Signatur
Beschreibung
setFloat16() schreibt einen Zahlenwert im Format IEEE 754 Half Precision (1 Vorzeichenbit, 5 Exponentenbits, 10 Mantissenbits) in genau 2 Bytes des zugrunde liegenden ArrayBuffer bzw. SharedArrayBuffer. Der Wert wird dabei auf die nächste darstellbare Float16-Zahl gerundet (bei Gleichstand zur geraden Mantisse).
Gebraucht wird die Methode vor allem bei Binärformaten und Grafik-/ML-Daten: Vertex-Attribute für WebGL/WebGPU, Half-Float-Texturen, quantisierte Gewichte neuronaler Netze oder kompakte Sensordaten. Gegenüber setFloat32() halbiert sich der Speicherbedarf – auf Kosten von Genauigkeit (ca. 3 Dezimalstellen) und Wertebereich (größter endlicher Wert: 65504).
Anders als ein Float16Array erlaubt DataView beliebige, auch nicht ausgerichtete Offsets und eine explizite Wahl der Byte-Reihenfolge. Ohne drittes Argument wird Big-Endian geschrieben – das ist ein häufiger Stolperstein, da die meisten Plattformen und Grafik-APIs Little-Endian erwarten.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $byteOffset Pflicht | number | Offset in Bytes vom Beginn der View, an dem geschrieben wird. Wird in eine Ganzzahl umgewandelt; byteOffset + 2 darf byteLength nicht überschreiten. |
|
| $value Pflicht | number | Zu speichernder Wert. Wird per ToNumber umgewandelt und auf die nächste Float16-Zahl gerundet. Zu große Beträge werden zu ±Infinity, sehr kleine zu ±0 bzw. subnormalen Werten. |
|
| $littleEndian | boolean | false | true schreibt Little-Endian, false bzw. weggelassen schreibt Big-Endian. |
Beispiele
Wert schreiben und Bytes prüfen (Big-Endian)
const view = new DataView(new ArrayBuffer(2));
view.setFloat16(0, 1.5);
console.log(view.getFloat16(0));
console.log(view.getUint8(0).toString(16), view.getUint8(1).toString(16));
Little-Endian für Grafik-APIs
const view = new DataView(new ArrayBuffer(2));
view.setFloat16(0, 1.5, true);
console.log([...new Uint8Array(view.buffer)]);
console.log(view.getFloat16(0, true)); // gleiche Reihenfolge beim Lesen!
Genauigkeitsverlust und Überlauf
const view = new DataView(new ArrayBuffer(6));
view.setFloat16(0, 0.1);
view.setFloat16(2, 65504);
view.setFloat16(4, 70000);
console.log(view.getFloat16(0));
console.log(view.getFloat16(2));
console.log(view.getFloat16(4));
Vertex-Daten kompakt verpacken
// Position (x, y, z) als Half-Floats, 8 Byte Stride (inkl. 2 Byte Padding)
const vertices = [[0, 0.5, 0], [-0.5, -0.5, 0], [0.5, -0.5, 0]];
const STRIDE = 8;
const view = new DataView(new ArrayBuffer(vertices.length * STRIDE));
vertices.forEach((v, i) => {
v.forEach((coord, j) => view.setFloat16(i * STRIDE + j * 2, coord, true));
});
console.log(view.byteLength, view.getFloat16(8, true));
// Wichtig · Fallstricke
- Standard-Byte-Reihenfolge ist Big-Endian. Beim Lesen mit
getFloat16()muss dieselbe Einstellung fürlittleEndianverwendet werden, sonst entstehen völlig falsche Werte. - Liegt
byteOffsetaußerhalb der View (oder ist negativ), wird einRangeErrorgeworfen. Ist der Puffer abgekoppelt (detached), folgt einTypeError. - Float16 bietet nur ca. 3 signifikante Dezimalstellen; Ganzzahlen sind nur bis
2048exakt darstellbar. MitMath.f16round()lässt sich die Rundung vorab prüfen. - Kompatibilität: neu in ES2025, erst in aktuellen Browsern (Chrome/Edge 135+, Firefox 129+, Safari 18.2+) und Node.js 24+. Vorher per Feature-Test
typeof DataView.prototype.setFloat16 === "function"prüfen und ggf. ein Polyfill (z. B.@petamoriken/float16) nutzen.