Start · Sprachen · JavaScript · Referenz · DataView.prototype.setFloat16()

DataView.prototype.setFloat16()

Methode

Speichert eine Zahl als 16-Bit-Gleitkommazahl (IEEE 754 binary16) in 2 Bytes ab dem angegebenen Byte-Offset des <code>DataView</code>.

seit JavaScript ES2025 (Baseline 2025: Chrome 135, Firefox 129, Sa Kategorie: method-property

Signatur

DataView.prototype.setFloat16(byteOffset, value, littleEndian)

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));
1.5 3e 0

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!
[0, 62] 1.5

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));
0.0999755859375 65504 Infinity

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));
24 -0.5

// Wichtig · Fallstricke

  • Standard-Byte-Reihenfolge ist Big-Endian. Beim Lesen mit getFloat16() muss dieselbe Einstellung für littleEndian verwendet werden, sonst entstehen völlig falsche Werte.
  • Liegt byteOffset außerhalb der View (oder ist negativ), wird ein RangeError geworfen. Ist der Puffer abgekoppelt (detached), folgt ein TypeError.
  • Float16 bietet nur ca. 3 signifikante Dezimalstellen; Ganzzahlen sind nur bis 2048 exakt darstellbar. Mit Math.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.