long double в printf на Redox: числа повышенной точности печатаются правильно

04.03.2026

Форматирование чисел в printf в relibc научилось понимать long double. Раньше значения повышенной точности выводились неверно.

Что такое long double

В обычной практике double хватает: 15–16 значащих цифр, ошибка примерно 10-16 от масштаба. Но есть задачи, где этого мало — численные расчёты, где накапливается ошибка, и результат нужно показать с большим числом знаков.

Тип long double даёт больше значащих цифр за счёт хранения мантиссы в 80-битном регистре на платформе x86. Он есть не везде, и на разных платформах имеет разный размер, поэтому код на C с ним требует осторожности.

Что было не так

Функция форматирования не знала про этот тип. Для double и float разбор шёл своим путём, а long double обрабатывался как нечто другое, и на выходе получалось неверное число — либо ошибка формата.

На практике это означало, что программа, которая считает и печатает результат с повышенной точностью, показывала мусор. Считает правильно — печатает неправильно: такой дефект обычно ищут не в том месте.

Почему это касается Rust

printf — не единственный путь вывода. В Rust числа форматируются через Display и Debug, и там f64 — единый тип. Но printf остаётся востребованным: код, перенесённый с C, продолжает его использовать, а через внешние интерфейсы тип long double иногда приходит из других языков.

То есть исправление снимает ошибку на границе между мирами — там, где Rust-код вызывает функцию C или читает значение из чужой библиотеки.

Оригинал

Коммит Implement long double in printf от 4 марта 2026 года в репозитории redox-os/relibc; сводка «This Month in Redox — March 2026», раздел «Relibc Improvements»

Упоминаний: 1 · Просмотров: 3