Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

trunc: Wasm numerische Anweisung

Die trunc numerische Anweisung, kurz für truncate, wird verwendet, um den Wert einer Gleitkommazahl ohne ihren Bruchteil zu erhalten.

trunc unterscheidet sich von floor, wenn es auf negative Zahlen angewendet wird — floor wird in diesen Fällen abrunden, während trunc aufrunden wird.

Es gibt separate Truncate-Anweisungen, die den Bruchteil einer Gleitkommazahl abschneiden und in eine Ganzzahl umwandeln:

Probieren Sie es aus

(module
  (import "console" "log" (func $log (param f32)))
  (func $main

    f32.const -2.7 ;; load a number onto the stack
    f32.trunc ;; discard everything after the decimal point
    call $log ;; log the result

  )
  (start $main)
)
const url = "{%wasm-url%}";
await WebAssembly.instantiateStreaming(fetch(url), { console });

Syntax

value_type.trunc
value_type

Der Typ des Wertes, auf den die Anweisung angewendet wird. Die folgenden Typen unterstützen trunc:

  • f32
  • f64
  • v128 Interpretationen:
    • f32x4
    • f64x2
trunc

Die trunc-Anweisung. Muss immer nach dem value_type und einem Punkt (.) eingefügt werden.

Typ

[input] -> [output]
input

Der Eingabewert.

output

Der Ausgabewert, der ein Gleitkommatyp ist.

Für ein nicht-SIMD trunc werden dies grundlegende numerische Werte wie 14.3 oder 3.0 sein.

Für ein SIMD trunc werden dies v128 Wertinterpretationen sein, zum Beispiel i32x4 100.5 6.0 7.8 83.1. Jede Spur des Ausgabewerts, der auf den Stack geschoben wird, entspricht der entsprechenden Spur des Eingabewerts ohne den Bruchteil.

Binärcodierung

Anweisung Binärformat Beispieltext => binär
f32.trunc 0x8f f32.trunc => 0x8f
f64.trunc 0x9d f64.trunc => 0x9d
f32x4.trunc 0xfd 105:u32 f32x4.trunc => 0xfd 0x69
f64x2.trunc 0xfd 122:u32 f64x2.trunc => 0xfd 0x7a

Beispiele

SIMD trunc Beispiel

In diesem Beispiel demonstrieren wir das Ausführen von trunc auf einem SIMD-Wert und das Ausgeben eines der Spurwerte des Ergebnisses.

JavaScript

In unserem Skript holen wir uns eine Referenz auf ein <p>-Element, in das wir unser Ergebnis ausgeben werden, und definieren dann ein Objekt, das in Wasm importiert wird und eine einzelne Funktion enthält, die einen Wert in das Ausgabefeld <p> schreibt. Anschließend kompilieren und instanziieren wir unser Wasm-Modul mit der Methode WebAssembly.instantiateStreaming() und importieren dabei das Objekt.

js
const outputElem = document.querySelector("p");

const obj = {
  output(val) {
    outputElem.textContent += val;
  },
};

WebAssembly.instantiateStreaming(fetch("{%wasm-url%}"), {
  obj,
});

Wasm

In unserem Wasm-Modul importieren wir zuerst die JavaScript output()-Funktion und stellen sicher, dass sie einen f64-Parameter deklariert. Dann deklarieren wir einen SIMD f64x2-Wert und verwenden f64x2.trunc, um den Bruchteil jeder Spur zu entfernen. Schließlich extrahieren wir den in Spur 1 des Ausgabewertes gespeicherten Wert mit der Anweisung extract_lane und geben ihn an das DOM aus, indem wir die importierte output()-Funktion aufrufen.

wat
(module
  ;; Import output function
  (import "obj" "output" (func $output (param f64)))

  (func $main
    ;; load a SIMD value onto the stack
    v128.const f64x2 3.9 2000.1

    f64x2.trunc ;; truncate each value
    f64x2.extract_lane 1 ;; Extract a value from the result
    call $output
  )

  (start $main)
)

Ergebnis

Die Ausgabe sieht wie folgt aus:

2000 wird ausgegeben, weil dies das Ergebnis des Entfernens des Bruchteils aus Spur 1 des Eingabewertes (2000.1) ist.

Spezifikationen

Spezifikation
WebAssembly Core Specification
# numeric-instructions%E2%91%A8

Browser-Kompatibilität

Siehe auch