trunc: Wasm-Anweisung für Text
Die trunc-Anweisung, kurz für truncation (Abschneiden), wird verwendet, um den Wert einer Fließkommazahl ohne ihren Bruchteil zu erhalten.
trunc unterscheidet sich von floor bei der Verwendung mit negativen Zahlen – floor wird in diesen Fällen abrunden, während trunc aufrundet.
Es gibt separate Anweisungen zum Trunkieren, die den Bruchteil einer Fließkommazahl abschneiden und sie in eine ganze Zahl 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 Werts, auf dem die Anweisung ausgeführt wird. Die folgenden Typen unterstützen
trunc:f32f64v128-Interpretationen:f32x4f64x2
trunc-
Die
trunc-Anweisung. Muss immer nach demvalue_typeund einem Punkt (.) eingefügt werden.
Typ
[input] -> [output]
Für ein nicht-SIMD-trunc sind dies grundlegende numerische Werte wie 14.3 oder 3.0.
Für ein SIMD-trunc sind dies v128-Wertinterpretationen, zum Beispiel i32x4 100.5 6.0 7.8 83.1. Jede Lane des Outputs, das auf den Stack geschoben wird, ist gleich der entsprechenden Lane des Eingabewerts mit entferntem Bruchteil.
Binäre Kodierung
| Anweisung | Binärformat | Beispiel Text => 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 die Ausführung von trunc auf einem SIMD-Wert und die Ausgabe eines der Lane-Werte des Ergebnisses.
JavaScript
In unserem Skript greifen wir auf eine <p>-Elementreferenz zu, an die wir unser Ergebnis ausgeben werden, und definieren dann ein Objekt für den Import in Wasm, das eine einzige Funktion enthält, die einen Wert an das <p>-Element schreibt. Wir kompilieren und instanziieren dann unser Wasm-Modul mithilfe der WebAssembly.instantiateStreaming()-Methode 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-Funktion output(), wobei wir sicherstellen, dass sie einen f64-Parameter hat. Anschließend deklarieren wir einen SIMD-f64x2-Wert und verwenden f64x2.trunc, um den Bruchteil jeder Lane zu entfernen. Schließlich extrahieren wir den Wert, der in Lane 1 des Ausgangswerts gespeichert ist, mithilfe der extract_lane-Anweisung und geben ihn über den Aufruf der importierten Funktion output() an das DOM aus.
(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 ist wie folgt:
2000 wird ausgegeben, da dies das Ergebnis des Entfernens des Bruchteils aus Lane 1 des Eingabewertes (2000.1) ist.