Technik Wiki
Advertisement
Technik Wiki

Wurzel ziehen[]

Variante 1[]

Editor Icon.png wurzel_ziehen:v1wurzel_ziehen.mcfunction
#  Wurzel berechnen

## Ausgabe zurücksetzen
execute if score berechnet v1.wurzel matches 0..99 run scoreboard players set ausgabe v1.wurzel 0

## maxCommandChainLength (Berechnungsgeschwindigkeit)
execute store result score maxCommandChainLength v1.wurzel run gamerule maxCommandChainLength
execute if score berechnet v1.wurzel matches 0..99 run scoreboard players operation maxCommandChainLength_2 v1.wurzel = maxCommandChainLength v1.wurzel

## Berechnung beschleunigen (Optional)
execute if score eingabe v1.wurzel matches 2048..46340 if score maxCommandChainLength v1.wurzel matches 16.. if score berechnet v1.wurzel matches 0..99 run function wurzel_ziehen:v1wurzel_ziehen_beschleunigen

## Eingabe Fehler Rückmeldung (Optional)
execute if score eingabe v1.wurzel matches -2147483648.. unless score eingabe v1.wurzel matches 0..46340 run tellraw @a {"text":"[Fehler] [v1.wurzel] : Ungültige Eingabe\nDie Eingabe ist negativ oder größer als 46340 .","color":"red"}

##  Starten
execute if score eingabe v1.wurzel matches 0..46340 if score maxCommandChainLength v1.wurzel matches 16.. if score berechnet v1.wurzel matches 0..99 run scoreboard players add berechnet v1.wurzel 100

##  Berechnen
execute if score berechnet v1.wurzel matches 100..199 run scoreboard players operation verarbeitung v1.wurzel = ausgabe v1.wurzel
execute if score berechnet v1.wurzel matches 100..199 run scoreboard players operation verarbeitung v1.wurzel *= ausgabe v1.wurzel
execute if score berechnet v1.wurzel matches 100..199 if score verarbeitung v1.wurzel < eingabe v1.wurzel run scoreboard players add ausgabe v1.wurzel 1

##  Wiederholen
execute if score berechnet v1.wurzel matches 100..199 run scoreboard players remove maxCommandChainLength_2 v1.wurzel 16
execute if score berechnet v1.wurzel matches 100..199 if score verarbeitung v1.wurzel < eingabe v1.wurzel if score maxCommandChainLength_2 v1.wurzel matches 16.. run function wurzel_ziehen:v1wurzel_ziehen
execute if score berechnet v1.wurzel matches 100..199 if score verarbeitung v1.wurzel < eingabe v1.wurzel unless score maxCommandChainLength_2 v1.wurzel matches 16.. run schedule function wurzel_ziehen:v1wurzel_ziehen 1t
scoreboard players operation maxCommandChainLength_2 v1.wurzel = maxCommandChainLength v1.wurzel

##  Beenden
execute if score berechnet v1.wurzel matches 100..199 if score verarbeitung v1.wurzel > eingabe v1.wurzel run scoreboard players remove ausgabe v1.wurzel 1
execute if score berechnet v1.wurzel matches 100..199 if score verarbeitung v1.wurzel >= eingabe v1.wurzel run scoreboard players add berechnet v1.wurzel 100

Zu beginn wird die Beispiel Funktion wurzel_ziehen:funktion_a ausgeführt .
Diese Funktion setzt die folgenden Variablen auf folgende Werte :
berechnet : 1 , eingabe : 256
Anschließend ruft die Beispiel Funktion wurzel_ziehen:funktion_a die Wurzel ziehen Funktion wurzel_ziehen:v1wurzel_ziehen auf.
Als erstes wird das letzte Ausgabe Ergebnis zurückgesetzt.
Dannach wird der aktuelle Wert der Spielregel maxCommandChainLength abgefragt und gespeichert. Zudem wird der maxCommandChainLength Verbrauch zurückgesetzt.
Wenn die Eingabe korrekt ist, wird die optionale Berechnungs Beschleunigungs Funktion wurzel_ziehen:v1wurzel_ziehen_beschleunigen zum beginn aufgerufen .
In dieser Funktion wird die Ausgabe auf ein vorher berechnetes Ergebnis gesetzt, das für eine Eingabe gilt. Dadurch muss sich Funktion wurzel_ziehen:v1wurzel_ziehen bei großen Eingaben nicht mehr so oft wiederholen .
Beim Start wird die Variable berechnet von 1 auf 101 gesetzt . Dadurch wird markiert das die Funktion wurzel_ziehen:v1wurzel_ziehen die Berechnung des Ergebnisses begonnen hat .
Bei der Berechnung muss man sich ein Viereck mit gleich langen Seiten vorstellen, wovon eine Seite die Ausgabe und die Verarbeitungs Variable ist und die Fläche des Vierecks die Eingabe ist.
Die Ausgabe beginnt bei 0 und wird hochgezählt bis Ausgabe*Ausgabe größer oder gleich der Eingabe ist .
Nachdem die Prüffläche durch multiplikation berechnet wurde, wird der Eigenverbrauch der Funktion von maxCommandChainLength_2 abgezogen.
Anschließend wird die Funktion wurzel_ziehen:v1wurzel_ziehen wiederholt, oder wenn der Vorrat von maxCommandChainLength_2 aufgebraucht ist, im nächsten Tick wiederholt .
Sollte der Vorrat von maxCommandChainLength_2 aufgebraucht sein, so wird er nach dem Wiederhol-Befehl wieder zurückgesetzt / wieder aufgefrischt .
Ist Ausgabe*Ausgabe größer der Eingabe so wird von der Ausgabe eins abgezogen und Ausgabe*Ausgabe ist nun kleiner oder gleich der Eingabe .
Die Variable berechnet von 101 auf 201 gesetzt . Dadurch wird markiert das die Funktion wurzel_ziehen:v1wurzel_ziehen die Berechnung des Ergebnisses vollzogen hat .
Nun erkennt eine nachfolgende Funktion das berechnet : 201 ist und kopiert das Ausgabe Ergebnis zur Weiterverarbeitung . Anschließend setzt die Funktion berechnet zurück und markiert dadurch das dass Ergebnis kopiert wurde und die Wurzel ziehen Funktion wurzel_ziehen:v1wurzel_ziehen wieder bereit ist für eine neue Eingabe einer anderen Funktion .

Kurzübersicht :
berechnet : 0 bis 99 - Eingabe-Befehl an die Funktion Wurzel ziehen, die Berechnung zu starten. Die Zahl speichert die Funktionszahl der Funktion, die die Berechnung gestartet hat .
berechnet : 100 bis 199 - Status das die Funktion Wurzel ziehen, die Berechnung gestartet hat. berechnet : 200 bis 299 - Ausgabe-Befehl an eine nachfolgende Funktion, die Ausgabe von Wurzel ziehen zu kopieren und berechnet zurückzusetzen, um eine neue Berechnung zu ermöglichen .
Die Zahl gibt die Funktionszahl an die das Ergebnis kopieren soll. Diese wurde am Anfang von der Funktion festgelegt die die Eingabe gesetzt und die Berechnung gestartet hat.

Editor Icon.png wurzel_ziehen:v1wurzel_ziehen_beschleunigen.mcfunction
#  Wurzel Berechnung beschleunigen

# Berechnungszeit bei niedriger maxCommandChainLength verkürzen
# maxCommandChainLength_2 Verbrauch bei normaler maxCommandChainLength reduzieren

# eingabe 134217728..2147483647

# 15/16 , 2013265920..2147483647
execute if score eingabe v1.wurzel matches 2013265920..2147483647 run scoreboard players set ausgabe v1.wurzel 44869

# 14/16 , 1879048192..2013265919
execute if score eingabe v1.wurzel matches 1879048192..2013265919 run scoreboard players set ausgabe v1.wurzel 43347

# 13/16 , 1744830464..1879048191
execute if score eingabe v1.wurzel matches 1744830464..1879048191 run scoreboard players set ausgabe v1.wurzel 41771

# 12/16 , 1610612736..1744830463
execute if score eingabe v1.wurzel matches 1610612736..1744830463 run scoreboard players set ausgabe v1.wurzel 40132

# 11/16 , 1476395008..1610612735
execute if score eingabe v1.wurzel matches 1476395008..1610612735 run scoreboard players set ausgabe v1.wurzel 38423

# 10/16 , 1342177280..1476395007
execute if score eingabe v1.wurzel matches 1342177280..1476395007 run scoreboard players set ausgabe v1.wurzel 36635

# 09/16 , 1207959552..1342177279
execute if score eingabe v1.wurzel matches 1207959552..1342177279 run scoreboard players set ausgabe v1.wurzel 34755

# 08/16 , 1073741824..1207959551
execute if score eingabe v1.wurzel matches 1073741824..1207959551 run scoreboard players set ausgabe v1.wurzel 32768

# 07/16 , 939524096..1073741823
execute if score eingabe v1.wurzel matches 939524096..1073741823 run scoreboard players set ausgabe v1.wurzel 30651

# 06/16 , 805306368..939524095
execute if score eingabe v1.wurzel matches 805306368..939524095 run scoreboard players set ausgabe v1.wurzel 28377

# 05/16 , 671088640..805306367
execute if score eingabe v1.wurzel matches 671088640..805306367 run scoreboard players set ausgabe v1.wurzel 25905

# 04/16 , 536870912..671088639
execute if score eingabe v1.wurzel matches 536870912..671088639 run scoreboard players set ausgabe v1.wurzel 23170

# 03/16 , 402653184..536870911
execute if score eingabe v1.wurzel matches 402653184..536870911 run scoreboard players set ausgabe v1.wurzel 20066

# 02/16 , 268435456..402653183
execute if score eingabe v1.wurzel matches 268435456..402653183 run scoreboard players set ausgabe v1.wurzel 16384

# 01/16 , 134217728..268435455
execute if score eingabe v1.wurzel matches 134217728..268435455 run scoreboard players set ausgabe v1.wurzel 11585


# Eigenverbrauch
execute if score berechnet v1.wurzel matches 100..199 run scoreboard players remove maxCommandChainLength_2 v1.wurzel 17
Advertisement