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:f32f64v128Interpretationen:f32x4f64x2
trunc-
Die
trunc-Anweisung. Muss immer nach demvalue_typeund einem Punkt (.) eingefügt werden.
Typ
[input] -> [output]
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.
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.
(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> |