Rust 1.98.0: алгебраические операции с плавающей точкой и быстрое форматирование чисел

· Программы
Команда Rust выпустила версию 1.98.0. Среди новшеств — «алгебраические» методы для чисел с плавающей точкой в духе -ffast-math, буферизованное форматирование целых чисел и стабилизированная гарантия по ManuallyDrop.

cover.svg

Команда Rust объявила о выходе стабильной версии языка 1.98.0. Обновиться, как обычно, можно командой rustup update stable.

Алгебраические операции с плавающей точкой

Типы f32 и f64 получили «алгебраические» методы сложения, вычитания, умножения, деления и взятия остатка. Они разрешают компилятору применять оптимизации, опираясь на свойства вещественных чисел — даже несмотря на то, что в мире ограниченного представления с плавающей точкой эти свойства строго не выполняются. По духу это близко к опции -ffast-math в других языках.

Классический пример — ассоциативность. Обычное сложение a + b + c + d компилятор обязан вычислять слева направо: ((a + b) + c) + d. Если же записать ту же сумму через цепочку вызовов algebraic_add, он волен переставить операции, например посчитать (a + b) + (c + d) параллельно. Часто это также открывает дорогу более широкой векторизации циклов. Методы недетерминированы — компилятор сам выбирает оптимизацию, — но неопределённого поведения не вызывают.

Быстрое форматирование целых чисел

Все примитивные целочисленные типы обзавелись методом format_into, принимающим &mut NumBuffer<Self> — буфер, гарантированно вмещающий десятичную запись любого значения этого типа. Метод возвращает готовый &str, заимствованный из буфера. Приём обходит значительную часть динамической диспетчеризации, свойственной форматированию через write!, и по замерам из репозитория itoa-benchmark работает наравне с самим itoa. Таким образом, format_into может стать штатной заменой этой и подобных зависимостей.

Уточнение по ManuallyDrop и Box

До версии 1.96.0 в компиляторе жила ошибка, из-за которой перемещение ManuallyDrop<Box<_>> после освобождения содержимого считалось неопределённым поведением — компилятор запрещает перемещать уже освобождённый Box, и ManuallyDrop наследовал это ограничение. В 1.96.0 поведение исправили, а теперь документацию обновили так, чтобы гарантировать: подобный код не будет UB и в будущем. Подробности — в документации ManuallyDrop и RFC 3336.

Стабилизированные API

В числе прочего стабилизированы str::substr_range, [T]::subslice_range, NonZero::from_str_radix, семейство String::from_utf16{le,be} и его lossy-варианты, strip_circumfix для строк и срезов, а также ряд методов Atomic<T> (from_mut, get_mut_slice, from_mut_slice). Полный перечень изменений в самом языке, Cargo и Clippy доступен в подробных заметках о релизе.


Источник: Lobsters

Комментарии

Войдите, чтобы комментировать.

  • Пока нет комментариев.