Rust 1.98 è arrivato con un pacchetto di novità che tocca un punto dolente noto da tempo a chi lavora con il calcolo numerico intensivo, ovvero la gestione delle operazioni in virgola mobile. La new entry più discussa è la famiglia di metodi algebrici per i tipi f32 e f64, pensata per dare al compilatore margini di manovra che prima semplicemente non esistevano.
Fino a oggi, un’espressione come a + b + c + d doveva rispettare rigorosamente l’ordine di valutazione da sinistra a destra, perché la somma in virgola mobile non è associativa (il risultato può cambiare a seconda dell’ordine delle operazioni). Con i nuovi metodi come algebraic_add, invece, si dice esplicitamente al compilatore che può riorganizzare i calcoli, ad esempio spezzando la somma in coppie da valutare in parallelo.
È un approccio concettualmente simile a quello dell’opzione -ffast-math, presente da anni in GCC e Clang. Tuttavia, c’è una differenza di fondo: Rust lo rende un’opzione esplicita a livello di singola chiamata, non un interruttore globale che altera il comportamento di tutto il programma.
Con la nuova versione arrivano anche un metodo format_into per la formattazione bufferizzata degli interi, una correzione di lunga data sull’interazione fra ManuallyDrop e Box, e una serie di API di libreria promosse a stabili.
Rust 1.98: cosa cambia
I metodi algebrici hanno sempre attirato attenzione, fin dal 2025, quando in alcuni benchmark un semplice prodotto scalare scritto in Rust risultava fino a otto volte più lento dell’equivalente in C++ su CPU x86_64 moderne. Questo perché il compilatore non poteva riordinare le operazioni per sfruttare la vettorizzazione.
I cinque metodi introdotti con Rust 1.98 coprono tutte le operazioni aritmetiche di base.
- algebraic_add. Per l’addizione.
- algebraic_sub. Per la sottrazione.
- algebraic_mul. Per la moltiplicazione.
- algebraic_div. Per la divisione.
- algebraic_rem. Per il resto.
Con questi cinque metodi il limite si supera, ma il prezzo da pagare è la perdita di determinismo, dato che a parità di input esecuzioni diverse dello stesso programma possono restituire risultati leggermente differenti. La documentazione ufficiale precisa che il codice unsafe non deve mai fare affidamento su proprietà specifiche del valore restituito.
Fortunatamente, per quanto il risultato numerico possa oscillare, questi metodi non introducono mai undefined behavior, un vincolo che li distingue nettamente da un semplice -ffast-math applicato all’intero programma.
Sul fronte della formattazione, format_into lavora insieme al nuovo tipo NumBuffer (un buffer opaco dimensionato per contenere la rappresentazione decimale di qualsiasi valore del tipo intero corrispondente). Secondo i benchmark del progetto itoa-benchmark, raggiunge prestazioni paragonabili alla libreria itoa, bypassando gran parte del dispatch dinamico tipico di write!.
Chiude il quadro la conferma, ora garantita in modo stabile, che spostare un ManuallyDrop<Box<_>> dopo averne rilasciato manualmente la memoria non è più comportamento indefinito, correzione già introdotta nella 1.96 e ora formalizzata nella documentazione.
Un aggiornamento tecnico

Preso nel suo insieme, Rust 1.98 è il classico rilascio interessante soprattutto negli ambienti tecnici. Per chi lavora su codice numerico o su librerie ad alte prestazioni, vale la pena guardarlo.
Il punto di forza dei metodi algebrici sta nella loro natura opt-in, dato che nessuno viene costretto a rinunciare alla prevedibilità dei calcoli in virgola mobile. Chi ha bisogno di velocità può attivarla chiamata per chiamata, senza il compromesso tutto o niente imposto da -ffast-math.
È una scelta di design, dove la sicurezza della memoria resta il valore predefinito e le scorciatoie prestazionali vanno richieste esplicitamente.
Le altre novità, dalla formattazione bufferizzata alla correzione su ManuallyDrop, sono altrettanto utili, dato che la prima toglie terreno a crate esterni come itoa, mentre la seconda chiude un capitolo di undefined behavior che si trascinava da tempo.
Nel complesso, la 1.98 conferma un pattern ormai consolidato nel ciclo di rilascio di Rust, fatto di incrementi piccoli ma ben pensati.













