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

View in English Always switch to English

floor: Wasm Text-Instruktion

Die floor-Instruktion wird verwendet, um den Wert einer Zahl auf die nächste ganze Zahl nach unten abzurunden.

floor unterscheidet sich von trunc bei der Verwendung mit negativen Zahlen — floor rundet in diesen Fällen nach unten, während trunc nach oben rundet.

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.floor ;; round down
    call $log ;; log the result

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

Syntax

value_type.floor
value_type

Der Typ des Wertes, auf dem die Instruktion angewendet wird. Die folgenden Typen unterstützen floor:

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

Die floor-Instruktion. Sie muss immer nach dem value_type und einem Punkt (.) eingefügt werden.

Typ

[input] -> [output]
input

Die Eingabe-v128-Wertinterpretation.

output

Die Ausgabe-v128-Wertinterpretation.

Bei einem nicht-SIMD-floor sind dies grundlegende numerische Werte wie 14.3 oder 3.0.

Bei einem SIMD-floor sind dies v128-Wertinterpretationen, zum Beispiel f32x4 1.9 2.5 0.5 12.1. Jede Lane des in den Stack geschobenen Outputs ist der abgerundete Wert der entsprechenden Lane im Eingabewert.

Binärkodierung

Instruktion Binärformat Beispieltext => Binär
f32.floor 0x8e f32.floor => 0x8e
f64.floor 0x9c f64.floor => 0x9c
f32x4.floor 0xfd 104:u32 f32x4.floor => 0xfd 0x68
f64x2.floor 0xfd 117:u32 f64x2.floor => 0xfd 0x75

Beispiele

SIMD floor-Beispiel

In diesem Beispiel demonstrieren wir das Ausführen von floor auf einem SIMD-Wert und geben einen der Lane-Werte des Ergebnisses aus.

JavaScript

In unserem Skript greifen wir auf ein <p>-Element zu, zu dem wir unser Ergebnis ausgeben werden, und definieren dann ein Objekt zum Import in Wasm, das eine einzelne Funktion enthält, die einen Wert an das Ausgabefeld <p> schreibt. Wir kompilieren und instanziieren dann unser Wasm-Modul mithilfe der Methode WebAssembly.instantiateStreaming(), wobei wir gleichzeitig das Objekt importieren.

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 zunächst die JavaScript-Funktion output(), wobei wir sicherstellen, dass sie einen f64-Parameter hat. Dann deklarieren wir einen SIMD-f64x2-Wert und verwenden f64x2.floor, um jede Lane nach unten auf die nächste ganze Zahl zu runden. Schließlich extrahieren wir den Wert, der in Lane 0 des Ausgabewertes gespeichert ist, mithilfe der Instruktion 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.floor ;; Round each value down
    f64x2.extract_lane 0 ;; Extract a value from the result
    call $output
  )

  (start $main)
)

Ergebnis

Die Ausgabe ist wie folgt:

3 wird ausgegeben, weil dies das Ergebnis des Abrundens von Lane 0 des Eingabewertes (3.9) auf die nächste ganze Zahl ist.