Команда Rust представила Rust 1.98, новую стабильную версию популярного языка системного программирования. В релиз вошли новые алгебраические методы для чисел с плавающей запятой, ускоренное буферизованное форматирование целых чисел и широкий набор стабилизированных API стандартной библиотеки.

Одно из самых заметных нововведений: новое семейство алгебраических методов для типов с плавающей запятой f32 и f64. Они охватывают сложение, вычитание, умножение, деление и вычисление остатка. Компилятор может выполнять оптимизации на основе алгебраических свойств вещественных чисел, даже если эти свойства не всегда строго выполняются для представлений с плавающей запятой.

Компилятор получает больше свободы при изменении порядка операций с плавающей запятой, что может расширить возможности векторизации циклов и других оптимизаций производительности. Команда Rust сравнивает эти оптимизации с теми, которые включаются опциями вроде -ffast-math в других языках, хотя точный набор таких оптимизаций намеренно не уточняется.

Например, обычное выражение a + b + c + d должно сохранять левоассоциативный порядок вычислений, потому что сложение чисел с плавающей запятой не ассоциативно. Если то же самое вычисление записать с помощью новых методов algebraic_add, компилятор может изменить порядок операций и, например, вычислять частичные суммы параллельно.

В Rust 1.98 также появился новый метод format_into для всех примитивных целочисленных типов. Он работает вместе с недавно стабилизированным типом NumBuffer, который предоставляет достаточно памяти для десятичного представления любого значения соответствующего целочисленного типа. Результат форматирования возвращается в виде строкового среза, заимствующего данные из этого буфера.

Ещё одно изменение касается взаимодействия между ManuallyDrop и Box. До версии Rust 1.96 перемещение ManuallyDrop<Box<_>> после явного удаления вложенного Box могло приводить к неопределённому поведению из-за ошибки компилятора. Это исправили в Rust 1.96, а в Rust 1.98 обновили документацию ManuallyDrop, чтобы гарантировать, что такой код больше не будет считаться неопределённым поведением.

В обработке строк также появилось несколько новшеств, среди которых String::from_utf16le, String::from_utf16be и их варианты с заменой недопустимых последовательностей для преобразования данных UTF-16 с явным порядком байтов little-endian и big-endian. Также для строк и срезов стабилизирован новый метод strip_circumfix.

Дополнительные подробности можно найти в анонсе. Как обычно, пользователи Rust могут обновиться через rustup, выполнив команду rustup update stable.