„Kann man in Rust nicht einfach a ** b schreiben?“ — Fragen Sie und… liegen falsch
\n\nWenn Sie von Python zu Rust kommen, ist der erste Schock das Fehlen des **-Operators. Der zweite Schock: Der Compiler verzeiht keine Freiheiten bei Typen. Der dritte (angenehme): Rust bietet ein ganzes Arsenal an Werkzeugen zur Potenzierung, die jeweils auf eine bestimmte Aufgabe zugeschnitten sind.
Im Jahr 2025, wenn Rust aktiv C++ in hochbelasteten Systemen und der Embedded-Entwicklung verdrängt, ist die Frage „How to raise a number to a power?“ (die auf Stack Overflow tausende Aufrufe gesammelt hat) noch relevanter geworden. Lassen Sie uns ein für alle Mal klären: wie man Zahlen in Rust richtig, schnell und sicher potenziert.
\n\nWarum gibt es in Rust keinen **-Operator?
\n\nRust ist eine systemnahe Sprache. Sie erlaubt keine „spontane“ Überladung von Operatoren (obwohl es die Traits std::ops gibt, aber für die Potenzierung existieren sie nicht). Stattdessen haben die Entwickler Methoden-Funktionen vorgeschlagen, die explizit den Operationstyp angeben. Dies schließt Verwechslungen zwischen ganzzahliger Potenzierung und Gleitkomma-Arithmetik aus.
Die Hauptregel: Wählen Sie die Methode entsprechend dem Datentyp. Versuchen Sie nicht, i32 mit f64 zu potenzieren – der Compiler wird Sie nicht verstehen, und wenn doch (durch Typumwandlung), riskieren Sie Leistungs- oder Genauigkeitsverlust.
Die Methode pow() – der König der ganzen Zahlen
\n\nDie beliebteste Methode für i32, u64 und andere ganzzahlige Typen:
fn main() {\n let base: i32 = 5;\n let exponent: u32 = 3;\n let result = base.pow(exponent);\n println!("5^3 = {}", result); // 125\n}\n\nBeachten Sie: exponent muss immer u32 (vorzeichenlos) sein. Das ist logisch – der Exponent kann für ganze Zahlen nicht negativ sein (sonst erhalten Sie einen Bruch).
Wann verwenden: Immer für ganzzahlige Berechnungen. Arbeitet schnell, ohne Allokationen, auf Maschineninstruktionsebene.
\n\nWas ist, wenn der Exponent negativ ist?
\nFür ganze Zahlen – gar nicht. Rust unterstützt keine negativen Exponenten für ganzzahlige Typen, da das Ergebnis gebrochen wäre. Wenn Sie 2^-3 benötigen – wechseln Sie zu Gleitkommazahlen.
powi() – die ideale Wahl für f64 und f32
\n\nDiese Methode akzeptiert einen ganzzahligen Exponenten (Typ i32), arbeitet aber mit Gleitkommazahlen:
fn main() {\n let base: f64 = 2.0;\n let result = base.powi(-3);\n println!("2.0^-3 = {}", result); // 0.125\n\n // Auch mit positivem Exponenten möglich\n let result2 = base.powi(10);\n println!("2.0^10 = {}", result2); // 1024.0\n}\n\nBesonderheit 2025: powi() ist für ganzzahlige Exponenten optimiert. Es verwendet den Algorithmus der schnellen Potenzierung (exponentiation by squaring). Wenn Ihr Exponent eine Konstante oder eine ganze Zahl ist, ist dies die schnellste Methode für f64/f32.
powf() – wenn der Exponent ebenfalls ein Bruch ist
\n\nWenn sowohl Basis als auch Exponent Gleitkommazahlen sind, verwenden Sie powf():
fn main() {\n let base: f64 = 9.0;\n let exponent: f64 = 0.5;\n let result = base.powf(exponent);\n println!("9.0^0.5 = {}", result); // 3.0 (Quadratwurzel)\n\n // Komplexer Fall\n let base2 = 2.0_f64;\n let exp2 = 3.14_f64;\n println!("2.0^3.14 = {}", base2.powf(exp2)); // ~8.815\n}\n\nWichtig: powf() verwendet eine langsame, aber genaue mathematische Bibliothek (normalerweise libm oder eine Hardware-Instruktion). Für Grafik oder Spiele, wo Geschwindigkeit wichtig ist, ziehen Sie powi() in Betracht.
Die Crate num – der Alleskönner
\n\nIm Jahr 2025 bietet das Rust-Ökosystem die Crate num (und num-