nearest: Wasm numerische Anweisung
Die nearest numerische Anweisung wird verwendet, um den Wert einer Gleitkommazahl auf die nächste ganze Zahl zu runden.
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.nearest ;; round to the nearest integer
call $log ;; log the result
)
(start $main)
)
const url = "{%wasm-url%}";
await WebAssembly.instantiateStreaming(fetch(url), { console });
Syntax
value_type.nearest
value_type-
Der Typ des Wertes, auf dem die Anweisung ausgeführt wird. Die folgenden Typen unterstützen
nearest:f32f64v128Interpretationen:f32x4f64x2
nearest-
Die
nearest-Anweisung. Muss immer nach demvalue_typeund einem Punkt (.) eingefügt werden.
Typ
[input] -> [output]
Für eine nicht-SIMD nearest sind dies grundlegende numerische Werte wie 3.5 oder 3.
Für eine SIMD nearest sind dies v128 Werteinterpretationen, zum Beispiel f32x4 3.5 6.0 10.1 40.9. Jede Lane des Outputs, der auf den Stack geschoben wird, entspricht der entsprechenden Lane des Eingabewertes, gerundet auf die nächste ganze Zahl.
Binärkodierung
| Anweisung | Binäre Format | Beispieltext => binär |
|---|---|---|
f32.nearest |
0x90 |
f32.nearest => 0x90 |
f64.nearest |
0x9e |
f64.nearest => 0x9e |
f32x4.nearest |
0xfd 106:u32 |
f32x4.nearest => 0xfd 0x6a |
f64x2.nearest |
0xfd 148:u32 |
f64x2.nearest => 0xfd 0x94 0x01 |
Beispiele
>SIMD nearest Rundung
In diesem Beispiel zeigen wir die Verwendung von nearest, um einen SIMD-Wert zu runden.
JavaScript
In unserem Skript holen wir eine Referenz zu einem <p> Element, zu dem wir unser Ergebnis ausgeben werden, und definieren dann ein Objekt, das eine einzelne Funktion enthält und in Wasm importiert wird, um einen Wert an das Ausgabe-<p> auszugeben. Dann kompilieren und instanziieren wir unser Wasm-Modul mit der Methode WebAssembly.instantiateStreaming(), wobei wir das Objekt im Prozess importieren.
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 f32 Parameter hat. Dann deklarieren wir einen SIMD f32x4 Wert und verwenden f32x4.nearest, um alle Lanes auf die nächste ganze Zahl zu runden. Schließlich extrahieren wir den Wert, der in Lane 3 des Ausgabewerts gespeichert ist, 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 f32)))
(func $main
;; load a SIMD value onto the stack
v128.const f32x4 400.3 28.5 79.9 80.1
f32x4.nearest ;; convert lanes to nearest integer
f32x4.extract_lane 3 ;; Extract a value from the result
call $output
)
(start $main)
)
Ergebnis
Die Ausgabe ist wie folgt:
80 wird ausgegeben, da es die nächste ganze Zahl zu dem Wert in Lane 3 des Eingabewertes (80.1) ist.
Spezifikationen
| Spezifikation |
|---|
| WebAssembly Core Specification> # numeric-instructions%E2%91%A8> |